Reactor
Reactor是整个Twisted事件循环的核心,提供了一些服务的基本接口,用于网络通信、线程和事件分发等。在Twisted中,Reactor是事件管理器,掌管着事件注册、注销,事件循环的运行,事件触发时回调函数的调用等。在Twisted中,Reactor是单例的,在每个程序中只能存在一个Reactor实例,Reactor实例在引用的时候会自动创建。
Reactor主要有以下特点。
- Reactor只能通过
reactor.run()
来启动。 - Reactor的停止需要调用
reactor.stop()
。 - Reactor的循环会在调用
reactor.run()
的线程中运行,一般为程序的主线程。 - Reactor一旦启动就会一直运行下去,直到使用Ctrl-C或者
kill
等方法结束程序运行。 - Reactor的事件循环不会消耗任何CPU资源。
- 不需要显式创建Reactor实例,Reactor实例会在引入的时候自动创建。
Twisted在默认情况下会按照操作系统自动安装相应类型的默认Reactor。如果需要使用其他类型的Reactor需要在引入Reactor之前手动安装。以下提供一个手动安装使用pollreactor
的示例。
from twisted.internet import pollreactor
pollreactor.install()
from twisted.internet import reactor
reactor.run()
选择不同类型的Reactor主要是根据所使用的操作系统和程序要实现的功能。Reactor基本上都是由twisted.internet
包提供的。常用的Reactor主要有以下这些。
selectreactor
适用于Unix和Windows系统,采用select()
实现,是在没有更好性能方案下的默认选择。
pollreactor
适用于Unix系统,采用select.poll
实现。
kqreactor
适用于FreeBSD系统,采用FreeBSD的kqueue
技术实现。
win32eventreactor
适用于Windows系统,采用WaitForMultiObjects
实现。
iocpreactor
适用于Windows系统,采用IO Completion Ports实现。
epollreactor
适用于Linux 2.6及以上版本核心的Linux发行版,采用epoll
实现。
gtk2reactor
适用于GTK 2.0图形程序。
gtk3reactor
适用于GTK 3.0图形程序。
cfreactor
适用于macOS系统,使用Cocoa框架实现。
wxreactor
适用于wxPython框架。对于wxPython框架,Twisted有两种实现方案,但是每一种都不是完美解决方案,并且可能会限制程序的跨平台特性。wxreactor
目前是兼容性比较好的一种选择。以下是wxreactor
的应用启动示例。
from twisted.internet import wxreactor; wxreactor.install()
from twisted.internet import reactor
import wx
app = wx.App(0)
reactor.registerWxApp(app)
reactor.run()