2011-06-23 35 views
2

我是新来扭曲,我试图了解一般异步编程的设计模式,特别是扭曲。从设计的角度来看,从协议子类访问反应堆是一个好主意,如下所示:在协议子类中使用twisted.internet.reactor

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

回答

3

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

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

谢谢。这真的很有帮助。 – gmemon

2

你可能会考虑一些调整,以这样的:

  • 接受reactor作为论据。这使得您的代码更易于测试,因为这意味着您可以在单元测试中传入一个与实时无关的假反应堆,并且可以检查以验证A的行为是否符合预期。
  • 不要丢弃reactor.callLater的结果。将其保存为A实例上的一个属性,以便稍后根据需要使用它。例如,您可能想取消它(考虑在延迟呼叫运行之前A实例失去连接的情况)。
  • 请勿在A.__init__内拨打reactor.callLater。相反,请拨打电话A.connectionMade。这一点取决于你为什么要使用延迟调用,但在连接建立后你想要做一些事情的可能性更大,而不是在协议实例化一段时间之后。这也可以让你有一个A实例,它并没有混淆反应堆(这是你可能想在单元测试中做的另一件事)。
+0

感谢您的所有建议。 – gmemon