基本概况
官网: https://twistedmatrix.com/trac/
github : https://github.com/twisted/twisted
api: https://twistedmatrix.com/documents/current/api/twisted.html
twisted 是 python 基于事件驱动的高性能异步网络编程框架,诞生于2000年初,支持python2.7和3.6+版本,twisted 是建立在deferred object(通过异部架构实现的机制)之上。与web框架的定位不同。
twisted 利用不同的底层技术实现了高性能通信,支持很多的协议,包括传输层的tcp、udp、tls,以及应用成的http、ftp等。twisted 提供了客户端和服务端的开发工具,详情可以参考api文档。
安装与版本。
pip install twisted
事件管理器(reactor)
reactor是学习twisted框架的最核心概念,我们称之为反应堆(其实是一个核心的死循环)
基础内容
#如果要使用其他的事件循环函数,则必须在引入reactor之前,先引入install来安装覆盖。
#from twisted.internet import protocol, selectreactor, endpoints
#selectreactor.install()
from twisted.internet import reactor
def main(message):
print(message)
reactor.stop()
if __name__ == '__main__':
reactor.callWhenRunning(main,'twisted开始运行') # 立即执行
reactor.run()
- 在twisted中,reator默认是不启动的,只有通过reactor.run()才启动,一旦启动,reactor就会在其开始的线程(主线程)不断的循环下去,可以直接通过reactor.stop()或者直接停止主线程退出。
- 在twisted中,reactor基于单例模式,即再一个程序中只有一个reactor,并且不需要创建reactor,只需要导入就可以使用。
- twisted中默认是基于select循环实现的,同时也提供了其他的模式,默认会根据系统启动最优的循环模式,也可以在引入twisted.internet.reactor前引入并安装他即可(调用install)(样例中注释内容)
- reactor不会因为回调函数中出现失败而停止,但是会报告异常。
- 在twisted中所有的事件触发都会被reactor监控,然后他会来时服务(初始化factory,factory再初始化protocol)。在没有事件需要处理的时候,reactor不会消耗任何cpu资源。
定时调用
from twisted.internet import reactor
def defer(num):
print("延时函数被调用了{0}".format(str(num)))
def main(message):
print(message)
call = reactor.callLater(10,defer,10) # 异步定时调用一次
print("main结束了")
if __name__ == '__main__':
reactor.callWhenRunning(main,'twisted开始运行') # 一般初始化使用的方法,非交互性
reactor.run()
多次定时调用
from twisted.internet import reactor
def defer(num):
print("defer函数被调用了{0}".format(str(num)))
#main('defer调用的main') # 重复调用
call = reactor.callLater(3,main,'defer调用的main') # 重复调用
def main(message):
print(message)
call = reactor.callLater(3,defer,10) # 异步定时调用一次
if __name__ == '__main__':
reactor.callWhenRunning(main,'twisted开始运行') # 一般初始化使用的方法,非交互性
reactor.run()
使用task函数多次重复调用
from twisted.internet import reactor
from twisted.internet import task
def defer(num):
print("defer函数被调用了{0}".format(str(num)))
def main(message):
print(message)
# 创建一个进行多次调用的对象(线程)
loop = task.LoopingCall(defer,10)
loop.start(3,now=True)
if __name__ == '__main__':
reactor.callWhenRunning(main,'twisted开始运行') # 一般初始化使用的方法,非交互性
reactor.run()