Reactor

Reactor是整个Twisted事件循环的核心,提供了一些服务的基本接口,用于网络通信、线程和事件分发等。在Twisted中,Reactor是事件管理器,掌管着事件注册、注销,事件循环的运行,事件触发时回调函数的调用等。在Twisted中,Reactor是单例的,在每个程序中只能存在一个Reactor实例,Reactor实例在引用的时候会自动创建。

Reactor主要有以下特点。

  1. Reactor只能通过reactor.run()来启动。
  2. Reactor的停止需要调用reactor.stop()
  3. Reactor的循环会在调用reactor.run()的线程中运行,一般为程序的主线程。
  4. Reactor一旦启动就会一直运行下去,直到使用Ctrl-C或者kill等方法结束程序运行。
  5. Reactor的事件循环不会消耗任何CPU资源。
  6. 不需要显式创建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()