在Protocol子类中使用twisted.internet.reactor

时间:2011-06-23 07:25:01

标签: protocols twisted reactor

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

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

2 个答案:

答案 0 :(得分:3)

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

reactor.callFromThread(reactor.callLater, 5, function_not_defined_here)

答案 1 :(得分:2)

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

  • 接受reactor作为参数。这使您的代码更容易测试,因为这意味着您可以在单元测试中传入一个独立于实时的假反应堆,并且可以进行检查以验证A的行为是否符合预期。
  • 请勿丢弃reactor.callLater的结果。将其另存为A实例上的属性,以便以后可以在必要时使用它。例如,您可能想要取消它(考虑A实例在延迟调用运行之前失去连接的情况。)
  • 请勿在{{1​​}}中致电reactor.callLater。相反,请在A.__init__中调用它。这个有点依赖于你为什么要使用延迟调用,但更有可能的是你想在建立连接后的某个时间做某事,而不是在实例化协议之后的某个时间。这也让你有一个A.connectionMade实例,它没有搞乱反应堆(这是你可能想要在单元测试中做的另一件事)。