twisted 初体验
前言:
最近帮朋友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 reactor和select reactor, 这个问题在网上曾有激烈的讨论, 可参见如下博文: "用python来开发webgame服务端(2)".
这边我们采用strace命令来查看一下:
strace python echo_server.py 2>&1 | grep epoll --color

通过strace命令工具, 可以在系统调用中看到, 该版本的twisted在当前的linux环境中, 采用epoll的模式.
总结:
twisted框架的入门门槛还是比较低的, 但若要深入和性能挖掘, 需要花费不少的时间. 著名的爬虫框架scrapy底层也是采用twisted来实现, 由此可见, twisted是一个非常优秀的高性能网络编程框架.
写在最后:
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

twisted 初体验的更多相关文章
- Django3.0 异步通信初体验
此前博主曾经写过一篇博文,介绍了Django3.0的新特性,其中最主要的就是加入对ASGI的支持,实现全双工的异步通信. 2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我 ...
- Django3.0 异步通信初体验(小结)
2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我们来尝试一下吧! (附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/e ...
- Scrapy初体验(一) 环境部署
系统选择centOs 7,Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
随机推荐
- 构建之法<第四章>之感悟
第四章:两人合作内容出处:4.6 两人合作的不同阶段和技巧 本章主要是讲关于合作方面的,文章以刚刚认识的两个人为例!也就是说,他们之前的关系是陌生人,然而在现实当中两人合作也可以有其它的关系,比如说合 ...
- java之代理模式
静态代理: java代理是一种模式--代理模式.采用代理模式,可以在不改变目标类代码的基础上,通过代理对象,来增加额外的功能(比如增加日志检测等)或者只需要目标对象的部分行为. java中,代理分为静 ...
- js 数组去除空值
for(var i = 0 ;i<wordarr.length;i++) { if(wordarr[i] == "& ...
- c++ 普通高精除高精
//codevs3118 高精度练习之除法 //打出了高精除高精,内心有点小激动. //还记得已开始学的时候非常难打 #include<cstdio>#include<cstring ...
- 2.精通前端系列技术之seajs和gruntJs结合开发(三)
1.我们先来了解下模块化历史 模块化历史 nodeJS的出现(http://nodejs.org/) commonJS规范(http://www.commonjs.org/) 浏览器JS的模块化? A ...
- 三元运算+lambda表达式
#三元运算,三目运算,if else简写 if 1 == 1: name = "liangml" else: name = "NB" #如果 1==1 成立,n ...
- 过滤器 Filter
Filter(过滤器)简介 Filter 的基本功能是对发送到 Servlet 的请求进行拦截, 并对响应也进行拦截. Filter 程序是一个实现了 Filter 接口的 Java 类,与 Serv ...
- [USACO精选] 第二章 动态规划(一)
#4 公司利润 2014-01-16 这真的是动归?怎么觉得有点贪心的心态在.时间复杂度O(N),空间复杂度O(1),轻松加愉快!唯一要注意的是ANS一开始要赋负值,因为最终答案可能是负的. ; va ...
- web安全测试-AppScan使用分享
这里主要分享如何使用AppScan对一大项目的部分功能进行安全扫描. ----------------------------------------------------------------- ...
- Html获取经纬度
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function success(pos) {alert( ...