twisted 初体验
前言:
最近帮朋友review其模块服务代码, 使用的是python的twisted网络框架. 鉴于之前并没有使用过, 于是决定好好研究一番.
个人接触最早的高性能网络编程框架是Mina, 所谓先入为主, 对异步网络编程的理解上, 往往冒出Mina的影子来.
本文借助简单的twisted demo例子, 对twisted有个初步的印象, 并作为学习笔记.
环境配置:
官网地址如下: twisted官网. 其不仅包含了twisted 源码和安装版本下载, 也包含了详尽的Echo样例.
以linux环境为例: python版本为2.7, 下载twisted的最新源码, 同时下载其依赖的zope.interface库.
环境配置可采用如下方式:
1). setup安装
1 | python setup.py install |
2). 配置PYTHONPATH
找到源码对应的位置, 配置环境变量PYTHONPATH, 这种情况可以绕过用户权限问题.
1 | export PYTHONPATH = / path / to / twisted: / path / to / zope.interface:${PYTHONPATH} |
例程:
twisted的Demo例程很多, 我们以最简单的Demo服务为例.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #! /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命令来查看一下:
1 | strace python echo_server.py 2 >& 1 | grep epoll - - color |
通过strace命令工具, 可以在系统调用中看到, 该版本的twisted在当前的linux环境中, 采用epoll的模式.
总结:
twisted框架的入门门槛还是比较低的, 但若要深入和性能挖掘, 需要花费不少的时间. 著名的爬虫框架scrapy底层也是采用twisted来实现, 由此可见, twisted是一个非常优秀的高性能网络编程框架.
写在最后:
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.
posted on 2015-05-25 13:24 mumuxinfei 阅读(1054) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构