前言:
  最近帮朋友review其模块服务代码, 使用的是python的twisted网络框架. 鉴于之前并没有使用过, 于是决定好好研究一番.
  个人接触最早的高性能网络编程框架是Mina, 所谓先入为主, 对异步网络编程的理解上, 往往冒出Mina的影子来.
  本文借助简单的twisted demo例子, 对twisted有个初步的印象, 并作为学习笔记.

环境配置:
  官网地址如下: twisted官网. 其不仅包含了twisted 源码和安装版本下载, 也包含了详尽的Echo样例.
  以linux环境为例: python版本为2.7, 下载twisted的最新源码, 同时下载其依赖的zope.interface库.
  环境配置可采用如下方式:
  1). setup安装

python setup.py install

  2). 配置PYTHONPATH
  找到源码对应的位置, 配置环境变量PYTHONPATH, 这种情况可以绕过用户权限问题.

export PYTHONPATH=/path/to/twisted:/path/to/zope.interface:${PYTHONPATH}

例程:
  twisted的Demo例程很多, 我们以最简单的Demo服务为例.

#! /usr/bin/python
#-*- coding: UTF-8 -*- from twisted.internet import reactor
from twisted.internet import protocol class Echo(protocol.Protocol):
def dataReceived(self, data):
self.transport.write(data) class EchoFactory(protocol.Factory):
def buildProtocol(self, addr):
return Echo() reactor.listenTCP(9090, EchoFactory())
reactor.run()

  整个echo服务, 只有短短的那么几行, 是不是很厉害, ^_^.
  twisted借助reactor, 来驱动网络IO的事件循环. 其层次可以看到Transport层和Protocol层.
  一个简单的网络服务, 开发者只需重新定义Protocol协议层即可.

测试:
  借助netcat工具来测试该echo服务.
  
  也可以借助telnet工具来测试, 两者皆可行.
  

简单分析:
  默认情况下, 其并没有利用到多核, 通过top -Hp命令才查看其线程数.
  
  即使是在压测过程中, 其twisted始终只有一个线程. 这和Mina的Acceptor线程和IO线程开分的方式还是有所区别, 不知道twisted怎么配置?
  还有一个问题是, twisted到底使用的epoll reactorselect reactor, 这个问题在网上曾有激烈的讨论, 可参见如下博文: "用python来开发webgame服务端(2)".
  这边我们采用strace命令来查看一下:

strace python echo_server.py 2>&1 | grep epoll --color

  
  通过strace命令工具, 可以在系统调用中看到, 该版本的twisted在当前的linux环境中, 采用epoll的模式.

总结:
  twisted框架的入门门槛还是比较低的, 但若要深入和性能挖掘, 需要花费不少的时间. 著名的爬虫框架scrapy底层也是采用twisted来实现, 由此可见, twisted是一个非常优秀的高性能网络编程框架.

写在最后:
  
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

  

twisted 初体验的更多相关文章

  1. Django3.0 异步通信初体验

    此前博主曾经写过一篇博文,介绍了Django3.0的新特性,其中最主要的就是加入对ASGI的支持,实现全双工的异步通信. 2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我 ...

  2. Django3.0 异步通信初体验(小结)

    2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我们来尝试一下吧! (附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/e ...

  3. Scrapy初体验(一) 环境部署

    系统选择centOs 7,Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, ...

  4. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  5. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  6. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  7. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  8. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  9. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

随机推荐

  1. S1:对象与JSON

    JSON全称为JavaScript对象表示法(JavaScript Object Notation). JSON是JavaScript中对象的字面量,是对象的表示方法,通过使用JSON,可以减少中间变 ...

  2. HDU 3255 扫描线(立方体体积并变形)

    Farming Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  3. 2.4.2电子书fb.c文件

    显示层面头文件 定义结构体,为显示统一标准 int (*DeviceInit)(void); 显示类驱动初始化 int (*ShowPixel)(int iPenX, int iPenY, unsig ...

  4. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  5. redis学习(一)

    一.redis简介 Redis是基于内存.可持久化的日志型.key-value高性能存储系统.关键字(Keys)是用来标识数据块.值(Values)是关联于关键字的实际值,可以是任何东西.有时候你会存 ...

  6. Java并发编程(二)线程任务的中断(interrupt)

    使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回. ...

  7. Hibernate中的集合映射

    1.定义实体 public class User { private int userId; private String userName; private Set<String> ad ...

  8. X230 安装win7 sp1

    早上起床发现win10歇菜了,死活启动不了只好重装系统 用稳定版本win7比较靠谱. 去msdn上下载 一个win7系统 win7旗舰版本64位 ed2k://|file|cn_windows_7_u ...

  9. mouseOver与rollOver

    区别: 当父容器监听这两个事件,鼠标从父容器移到子容器再移回父容器时,会触发mouseOver.mouseout事件,但是不会触发rollover.rollout事件.

  10. 在ubunut下使用pycharm和eclipse进行python远程调试

    我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具--IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用e ...