选择反应器和 GUI 工具包集成

概述

Twisted 提供了 twisted.internet.reactor 的多种实现。这些专门的实现适合不同的目的,并且旨在更好地与特定平台集成。

基于 epoll() 的反应器 是 Twisted 在 Linux 上的默认反应器。其他平台使用 poll(),或者最跨平台的反应器,select()

特定平台的反应器实现存在于以下平台:

其余的自定义反应器实现提供了对与各种图形工具包的原生事件循环集成的支持。这使您的 Twisted 应用程序可以使用所有常用的 Twisted API,同时仍然是图形应用程序。

Twisted 目前与以下图形工具包集成:

当使用可以使用 twistd 运行的应用程序(例如 TAC 或插件)时,无需显式选择反应器,因为可以使用 twistd 的 -r 选项选择反应器。

在所有情况下,事件循环都是通过调用 reactor.run() 启动的。在所有情况下,事件循环都应该使用 reactor.stop() 停止。

重要:安装反应器应该是应用程序中要做的第一件事,因为任何执行 from twisted.internet import reactor 的代码如果代码尚未安装反应器,将自动安装默认反应器。

反应器功能

状态

TCP

SSL

UDP

线程

进程

调度

平台

select()

稳定

Y

Y

Y

Y

Y

Y

Unix、Win32

poll

稳定

Y

Y

Y

Y

Y

Y

Unix

Win32 的 WaitForMultipleObjects (WFMO)

实验性

Y

Y

Y

Y

Y

Y

Win32

Win32 的输入/输出完成端口 (IOCP)

实验性

Y

Y

Y

Y

Y

Y

Win32

CoreFoundation

未维护

Y

Y

Y

Y

Y

Y

macOS

epoll

稳定

Y

Y

Y

Y

Y

Y

Linux 2.6

GTK+

稳定

Y

Y

Y

Y

Y

Y

Unix、Win32

wx

实验性

Y

Y

Y

Y

Y

Y

Unix、Win32

kqueue

稳定

Y

Y

Y

Y

Y

Y

FreeBSD

通用反应器

基于 Select() 的反应器

select 反应器是在没有提供覆盖所有用例的更好替代方案的平台上的默认反应器。如果需要 select 反应器,可以通过以下方式安装:

from twisted.internet import selectreactor
selectreactor.install()

from twisted.internet import reactor

特定平台的反应器

基于 Poll 的反应器

PollReactor 将在提供 select.poll 的任何平台上运行。对于大量连接的套接字,它可能比 SelectReactor 提供更好的性能。

from twisted.internet import pollreactor
pollreactor.install()

from twisted.internet import reactor

KQueue

KQueue Reactor 允许 Twisted 使用 FreeBSD 的 kqueue 机制进行事件调度。有关安装说明,请参阅 twisted.internet.kqreactor 的文档字符串。

from twisted.internet import kqreactor
kqreactor.install()

from twisted.internet import reactor

Win32 的 WaitForMultipleObjects (WFMO)

Win32 反应器尚未完成,并且存在各种需要解决的限制和问题。该反应器支持与 win32gui 模块的 GUI 集成,因此它可以用于本机 Win32 GUI 应用程序。

from twisted.internet import win32eventreactor
win32eventreactor.install()

from twisted.internet import reactor

Win32 的输入/输出完成端口 (IOCP)

Windows 提供了一个快速、可扩展的事件通知系统,称为 IO 完成端口,简称 IOCP。Twisted 包含一个基于 IOCP 的反应器,该反应器几乎已完成。

from twisted.internet import iocpreactor
iocpreactor.install()

from twisted.internet import reactor

基于 Epoll 的反应器

EPollReactor 将在提供 epoll 的任何平台上运行,目前仅限于 Linux 2.6 及更高版本。epoll 反应器的实现目前使用级别触发接口,它基本上类似于 poll(),但可扩展性要好得多。

from twisted.internet import epollreactor
epollreactor.install()

from twisted.internet import reactor

GUI 集成反应器

GTK+

Twisted 使用 gtk2reactorPyGTK 版本 2.0 集成。一个使用 GTK+ 的 Twisted 应用程序示例可以在 doc/core/examples/pbgtk2.py 中找到。

GTK-2.0 将事件循环从 GUI 工具包中分离出来,并将其放入一个名为“glib” 的单独模块中。要使用 glib 事件循环运行应用程序,请使用 glib2reactor。这将比 gtk2reactor 稍微快一些(并且不需要工作 X 显示),但不能用于运行 GUI 应用程序。

from twisted.internet import gtk2reactor # for gtk-2.0
gtk2reactor.install()

from twisted.internet import reactor
from twisted.internet import glib2reactor # for non-GUI apps
glib2reactor.install()

from twisted.internet import reactor

GTK+ 3.0 和 GObject Introspection

Twisted 使用 gtk3reactorgireactor 反应器与 GTK+ 3 和 GObject 集成,通过 PyGObject 的内省。

from twisted.internet import gtk3reactor
gtk3reactor.install()

from twisted.internet import reactor
from twisted.internet import gireactor # for non-GUI apps
gireactor.install()

from twisted.internet import reactor

GLib 3.0 引入了 GApplication 的概念,这是一个以跨平台方式处理应用程序唯一性的类,并提供自己的主循环。它的对应类 GtkApplication 也处理与打开窗口相关的应用程序生命周期。Twisted 支持将这些对象注册到事件循环中,这应该在运行反应器之前完成。

from twisted.internet import gtk3reactor
gtk3reactor.install()

from gi.repository import Gtk
app = Gtk.Application(...)

from twisted import reactor
reactor.registerGApplication(app)
reactor.run()

wxPython

Twisted 目前支持两种将 wxPython 集成在一起的方法。不幸的是,这两种方法都不适用于所有 wxPython 平台(例如 GTK2 或 Windows)。似乎将 Twisted 与 wxPython 应用程序集成的唯一可移植方法是在单独的线程中运行它。如果您的 wx 应用程序仅限于单个平台,其中一种方法可能就足够了。

Tkinter 一样,将 Twisted 与 wxPython 应用程序集成的支持使用专门的支持代码,而不是简单的反应器。

from wxPython.wx import *
from twisted.internet import wxsupport, reactor

myWxAppInstance = wxApp(0)
wxsupport.install(myWxAppInstance)

但是,这在 Windows 上运行时存在问题,因此 Twisted 现在附带了使用反应器的替代 wxPython 支持。使用这种方法可能更好。初始化分两个阶段进行。在第一个阶段,安装反应器

from twisted.internet import wxreactor
wxreactor.install()

from twisted.internet import reactor

稍后,在创建 wxApp 实例后,但在调用 reactor.run() 之前

from twisted.internet import reactor
myWxAppInstance = wxApp(0)
reactor.registerWxApp(myWxAppInstance)

一个使用 wxPython 的 Twisted 应用程序示例可以在 doc/core/examples/wxdemo.py 中找到。

CoreFoundation

Twisted 集成了 PyObjC 版本 1.0。在 doc/core/examples/threadedselect/Cocoa 目录下的示例目录中,提供了使用 Cocoa 和 Twisted 的示例应用程序。

from twisted.internet import cfreactor
cfreactor.install()

from twisted.internet import reactor

非 Reactor GUI 集成

Tkinter

Tkinter 的支持不使用专门的 Reactor。相反,有一些专门的代码支持。

from tkinter import *
from twisted.internet import tksupport, reactor

root = Tk()

# Install the Reactor support
tksupport.install(root)

# at this point build Tk app as usual using the root object,
# and start the program with "reactor.run()", and stop it
# with "reactor.stop()".

PyUI

Tkinter 一样,将 Twisted 集成到 PyUI 应用程序中的支持使用专门的代码支持,而不是简单的 Reactor。

from twisted.internet import pyuisupport, reactor

pyuisupport.install(args=(640, 480), kw={'renderer': 'gl'})

一个使用 PyUI 的 Twisted 应用程序示例可以在 doc/core/examples/pyuidemo.py 中找到。