2013-06-25 34 views
0

如果我創建通過這樣多個客戶端:Python的扭停止反應堆多個客戶端

def main(): 
    clients = [None]*10 

    for i in range(0, 10): 
     clients[i] = ClientFactory() 
     reactor.connectTCP('192.168.0.1', 8000, clients[i]) 

    reactor.run() 

如何我-gracefully-停止反應堆?如果我做的:

self.transport.loseconnection() 

在該協議中,然後執行:

reactor.stop() 

在工廠,那麼下一個客戶端要嘗試沿着再來停止反應堆。但是,這當然會導致錯誤:

Can't stop a reactor that isn't running 

如何在這種情況下優雅地停止反應器?

回答

0

把你的反應堆管理代碼拿出你的協議實現。將其替換爲一些事件通知代碼,您可以使用該代碼瞭解連接完成所需的所有事情時的情況。例如,發射一個Deferred

然後等待所有的延期,並當他們都完成時停止反應堆。您可能會發現gatherResults對此很有幫助。

0

自從我對Twisted做了任何事情之後已經有一段時間了,但是您不能僅僅首先檢查reactor.running屬性的值嗎?例如,

# Gracefully stop the reactor 
if reactor.running: 
    reactor.stop() 
+0

這並不理想。 「跑步」並不意味着你的想法,所以這個解決方案有時會失敗。 –