2

我是 twisted 的新手,我正在尝试了解一般异步编程的设计模式,特别是 twisted。从设计的角度来看,从协议子类访问反应器是一个好主意,如下所示:

class A(Protocol):
   def __init__(self):
      reactor.callLater(5, function_not_defined_here)
4

2 回答 2

3

是的,这绝对是标准的。您可以从应用程序中的任何位置( prepost reactor.run())调用反应器方法。唯一的例外是使用线程时,在这种情况下,您需要将反应器方法调用包装在 中reactor.callFromThread(),例如:

reactor.callFromThread(reactor.callLater, 5, function_not_defined_here)
于 2011-06-23T11:04:23.080 回答
2

您可能会考虑对此进行一些调整:

  • 接受reactor作为参数。这使您的代码更容易测试,因为这意味着您可以在单元测试中传入一个假反应器,该反应器独立于实时,并且可以检查以验证A其行为是否符合预期。
  • 不要丢弃reactor.callLater. 将其保存为A实例上的属性,以便您以后可以在必要时使用它。例如,您可能想要取消它(考虑A实例在延迟调用运行之前失去连接的情况)。
  • 不要打reactor.callLater进来A.__init__。相反,在A.connectionMade. 这一点取决于您为什么要使用延迟调用,但是您更有可能在建立连接后的某个时间而不是在协议实例化后的某个时间做某事。这也让您拥有一个A尚未与反应器混淆的实例(这是您在单元测试中可能想要做的另一件事)。
于 2011-06-23T12:58:34.227 回答