前言:
  最近帮朋友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. 计算excel列的名字

    #include <iostream> using namespace std; int main() {     unsigned int column;     cin>> ...

  2. mrg_myIsam分表引擎用法

    CREATE TABLE `test`.`article_0` ( `id` BIGINT( 20 ) NOT NULL , `subject` VARCHAR( 200 ) NOT NULL , ` ...

  3. dbcp连接池配置参数

    1.<!-- 数据源1 --> 2. <bean id="dataSource" 3. class="org.apache.commons.dbcp.B ...

  4. 如何在滚动报表时保持标题可见 (Reporting Services)

    From: https://msdn.microsoft.com/zh-cn/library/bb934257.aspx 对于跨多页的表或矩阵数据区域,可以控制滚动报表时是否始终显示包含列标题的初始行 ...

  5. java面试题之ssh

    1.写出你熟悉的开源框架以及各自的作用(项目中为什么使用SSH) 答:框架:hibernate,spring,struts1/struts2. Hibernate主要用于数据持久化:封装了JDBC操作 ...

  6. 【kate总结】Matlab坐标轴问题

    [kate总结]Matlab坐标轴问题 总结而言 行óYó高ó垂直 列óXó宽ó水平 Maplab中存有2张图片 1.JPG 宽(列):320    高(行):482 在matlab中显示 2.JPG ...

  7. 跨域请求之jQuery的ajax jsonp的使用解惑

    前天在项目中写的一个ajax jsonp的使用,出现了问题:可以成功获得请求结果,但没有执行success方法,直接执行了error方法提示错误——ajax jsonp之前并没有用过,对其的理解为跟普 ...

  8. LINQ基础 之 LINQ TO SQL (二)

    配置LINQ TO SQL 首先添加一个Linq to sql文件,以.dbml结尾的文件.无法把表拖拽到.dbml文件中,提示“所选对象使用不支持的数据提供程序” 解决方案 在服务器资源管理器中右键 ...

  9. CentOS 7.0默认使用的是firewall作为防火墙。

    systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service#停止firewallsystemctl dis ...

  10. Hadoop c++开发

    假设你有上百G的数据,你要统计出这些数据中,含有某些你感兴趣的内容的数据的有多少条,你会怎么做?在硬件条件允许的情况下,用hadoop并行计算是一个不错的选择. 为了使本文得以清晰地说明,我们不妨假设 ...