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后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
随机推荐
- eclipse debug 过滤一些包
eclipse debug java程序的时候, 我们按F5的时候,常常会进入java自带类库里,这些类库并不是我们需要debug的代码,这样会影响debug的效率,我们可以在eclipse里设置,过 ...
- android 计算器的实现(转)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- HDU 5313 bitset优化背包
题目大意: 添加尽可能少的边,最后使图形成二分图 一开始将图区分成一个个联通分量,根据二分图染色,计算出每个联通分量的黑色点和白色点的个数 希望添加的边最少,那么合并的时候,希望黑白块尽可能平均,这无 ...
- The Coco-Cola Store C(Contest #3 )
Once upon a time, there is a special coco-cola store. If you return three empty bottles to the shop, ...
- DotNetBar v12.9.0.0 Fully Cracked
更新信息: http://www.devcomponents.com/customeronly/releasenotes.asp?p=dnbwf&v=12.9.0.0 如果遇到破解问题可以与我 ...
- [转][C/C++]函数名字修饰(Decorated Name)方式
1.C/C++函数修饰名: 对于我们的C/C++源程序而言,函数名只是函数的一小部分,函数还有调用方式(参数入栈方式).返回值类型.参数个数和各参数类型等信息,对于C++类成员函数,还有更多信息.这些 ...
- Ajax get方法 IE 下乱码
每个浏览器处理编码的格式不同. ajax使用utf-8来编码发送数据,ie在发送时并没加上charset=utf-8,从而导致乱码(IE默认使用iso-8859-1编码) JavaScript代码: ...
- == 和 isEqualToString的区别之备忘
== 比较的是指针 isEqualToString 比较的是指针指向的内容 比如: NSString * strA = @"abc"; NSString * strB = @&qu ...
- uva11059
除法(Division,uva725) 输入整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列(可以有前导0),2<=n<=79. ...
- treap模版代码
treap模版暂存. 以后修改整理. #include<cstdio> #include<iostream> #include <time.h> #include& ...