2013-06-25 2 views
0

Если я создаю несколько клиентов, делая это:Python Twisted остановки реактора с несколькими клиентами

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

Внесите свой код управления реактором из вашей реализации протокола. Замените его кодом уведомления о событии, который вы можете использовать, чтобы узнать, когда соединение сделало все, что ему нужно. Например, запустите a Deferred.

Затем подождите все отложенные и остановите реактор, когда все будет готово. Вы можете найти gatherResults полезный для этого.

0

Прошло некоторое время с тех пор, как я сделал что-нибудь с Twisted, но не мог бы вы сначала проверить значение свойства reactor.running? Например,

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

Это не идеально. 'running' не означает, что вы думаете, что это так, поэтому это решение по-прежнему будет терпеть неудачу. –