1

我有一个基于twisted reactor的服务器,我需要如下场景:服务器可以接收两种类型的请求

  • ADD(x,y) 并返回一个总和
  • HUMAN_PERMISSION 仅当人类用户批准客户端的 ip 时才返回 true

我正在使用 tkMessageBox 询问人类用户,但问题是它阻塞了整个反应器并且服务器对其他请求没有响应

我知道我必须以某种方式在这里使用twisted's deferred,只是不知道这是怎么回事:似乎不起作用,它仍然阻塞了整个反应堆

d = deferLater(reactor, 1,tkMessageBox.showinfo, "is he ok?", clientIp)
d.addCallback(confirmUser)
4

1 回答 1

0

Deferreds 不能做任何事情来使您的代码非阻塞。他们所能做的就是根据现有的非阻塞事件管理回调链。这就是让您可以将“收到一些字节”或“连接丢失”或“用户单击按钮”等低级别事件转换为“HTTP 请求已响应”或“用户已回答”等高级事件的原因你的问题”。 deferLater,例如,Deferred在经过一段时间后简单地触发它。

您甚至不需要反应器即可使用 a 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()从任何地方拨打电话;它通常只是从反应堆事件中调用。在您的情况下,您可能希望改为callbackTk事件中调用。

综上所述,您需要一种将Tk事件放入主反应器线程的方法,您可以使用了解Tk's mainloop 的反应器来做到这一点。一位评论者已经提到,有一个现有的 API twisted.internet.tksupport:. 鉴于这Tk不是当今最流行的 GUI,您可能会发现一些问题,因此如果您发现任何问题,请报告它们。

于 2011-04-21T23:17:24.710 回答