2011-06-23 34 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