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()