基本概况

官网: 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()

Q.E.D.