我有一台基于扭曲反应堆的服务器,我需要以下场景: 服务器可以接收两种类型的请求
我正在使用tkMessageBox来询问人类用户,但问题是它阻塞了整个反应堆,服务器对其他请求没有响应
我明白我必须以某种方式使用扭曲的延迟,只是不知道如何 这个:似乎没有用,它仍然会阻塞整个反应堆
d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?", clientIp)
d.addCallback(confirmUser)
答案 0 :(得分:0)
Deferreds无法做任何事情来使您的代码无阻塞。他们所能做的就是根据现有的非阻塞事件来管理回调链。这就是让你将低级别事件(例如“收到一些字节”或“连接丢失”或“用户点击按钮”)转换为“HTTP请求已响应”或“用户回答”等高级别事件的原因你的问题”。例如,deferLater
只会在经过一段时间后触发Deferred
。
您甚至不需要反应堆来使用Deferred
。例如:
>>> from twisted.internet.defer import Deferred
>>> d = Deferred()
>>> def transformResult(result):
... return result + 5
...
>>> d.addCallback(transformResult)
<Deferred at 0x100521200>
>>> def itsDone(result):
... print("It's done: " + str(result))
...
>>> d.addCallback(itsDone)
<Deferred at 0x100521200>
>>> d.callback(3)
It's done: 8
>>>
您可以从任何地方拨打callback()
;它只是通常从反应堆事件中调用。在您的情况下,您可能希望从callback
事件中致电Tk
。
所有这一切,您需要一种方法将Tk
事件传递到主反应堆线程中,您可以使用知道Tk
主循环的反应堆来完成。一位评论者已经提到过现有的API:twisted.internet.tksupport
。鉴于Tk
目前不是最受欢迎的图形用户界面,您可能会发现一些问题,所以如果您发现任何问题,请report them。