Python Twisted中的非阻塞服务器

Python Twisted中的非阻塞服务器,python,twisted,Python,Twisted,我正在构建一个应用程序,它需要在主线程以外的线程上运行TCP服务器。尝试运行以下代码时: reactor.listenTCP(ServerConfiguration.tcpport, TcpCommandFactory()) reactor.run() 我得到以下错误 exceptions.ValueError:信号仅在主线程中工作 我可以在主线程以外的线程上运行twisted服务器吗 Twisted可以在任何线程中运行,但一次只能运行一个线程。如果要在非主线程中运行,只需执行reactor.

我正在构建一个应用程序,它需要在主线程以外的线程上运行TCP服务器。尝试运行以下代码时:

reactor.listenTCP(ServerConfiguration.tcpport, TcpCommandFactory())
reactor.run()
我得到以下错误

exceptions.ValueError:信号仅在主线程中工作


我可以在主线程以外的线程上运行twisted服务器吗

Twisted可以在任何线程中运行,但一次只能运行一个线程。如果要在非主线程中运行,只需执行
reactor.run(installSignalHandlers=False)
。但是,您不能在非主线程上使用反应器来生成子进程,因为它们的终止将永远不会被检测到。(这实际上是UNIX的限制,而不是Twisted。)

Twisted本质上是非阻塞的。从我执行的测试中可以看出,它确实会阻塞主线程,如果在“reactor.run()”命令前后放置一条打印消息,您将看到after消息将永远不会打印。reactor.run()运行twisted,直到twisted完成并关闭,然后在reactor.run之后运行代码。您可以将代码与twisted函数/回调集成,从而实现非阻塞。我选择放弃twisted并在大多数情况下使用gevent。我听说zeroMQ也很棒。如果您不熟悉异步编程,可能会有所帮助。您能解释一下为什么您决定需要线程吗?Twisted中的某个地方可能有一个API,它可以帮助您在没有线程的情况下实现您的目标。非常感谢,我之前没有找到这个,但是Twisted FAQ有一个关于这个主题的条目!你救了我的命,很高兴我们能帮忙@Glyph有没有一种方法可以在No的范围内使用它<代码>反应旨在为您的程序要点提供合理的默认值。如果您想自己使用自定义标志小心地管理反应器,则需要调用
reactor.run
并管理其生命周期。