2010-10-03 3 views
2

Я пытаюсь научить себя некоторым элементарным витым программистам благодаря this tutorial и многим другим. Я пришел к этому текущему примеру, который я не могу понять, почему он делает то, что он делает.Реактор останавливался раньше, чем я ожидал?

Краткое описание: Я создал три реактора, которые отсчитывают от 5 до 1 с различными задержками в их подсчете. Единственное, похоже, когда первый счетчик (с самой короткой задержкой) достигает 0, он останавливает не только собственный реактор, но и все остальные.

#!/usr/bin/env python 

class Countdown(object): 

    counter = 5 

    def count1(self): 
     from twisted.internet import reactor 
     if self.counter == 0: 
      reactor.stop() 
     else: 
      print self.counter, '...1' 
      self.counter -= 1 
      reactor.callLater(1, self.count1) 

    def count2(self): 
     from twisted.internet import reactor 
     if self.counter == 0: 
      reactor.stop() 
     else: 
      print self.counter, '...2' 
      self.counter -= 1 
      reactor.callLater(0.5, self.count2) 

    def count3(self): 
     from twisted.internet import reactor 
     if self.counter == 0: 
      reactor.stop() 
     else: 
      print self.counter, '...3' 
      self.counter -= 1 
      reactor.callLater(0.25, self.count3) 

from twisted.internet import reactor 

reactor.callWhenRunning(Countdown().count1) 
reactor.callWhenRunning(Countdown().count2) 
reactor.callWhenRunning(Countdown().count3) 

print 'Start!' 
reactor.run() 
print 'Stop!' 

Выход

Start! 
5 ...1 
5 ...2 
5 ...3 
4 ...3 
4 ...2 
3 ...3 
2 ...3 
4 ...1 
3 ...2 
1 ...3 
Stop! 

Я был под впечатлением, что в то время как все три счетчика должны отсчитывать по их собственной скорости и завершить их 5-> 0 прогрессию, программа будет ждать их всех, чтобы завершить перед выходом. Я что-то недопонимаю здесь способами?

ответ

1

Я не знаком с извращенным, но из результатов сглаживания google похоже, что реактор - это цикл событий. У вас есть только один из них, поэтому первый счетчик ударит по реактору.stop() останавливает цикл.

Чтобы сделать то, что вы хотите, вы должны удалить reactor.stop() вызовы и структура вещи таким образом, что, когда последний таймер доходит до конца, и только он, вызывает reactor.stop()

+0

Брайан, спасибо за отзыв. Может быть, я просто недостаточно знаком с методами Twisted, но как бы я закодировал условный поиск «последнего таймера»? Я думал об использовании getDelayedCalls, но это, похоже, работает только с использованием callLater, а не с callWhenRunning. – jfofo

0

Он говорит немного об этом в part 3. Вы можете смешивать «запуск трех реакторов на одном сервере» и «запуск трех разных серверов». В примерах предлагается сделать последнее; ваш код пытается сделать первый.

В основном реактор является singleton и не может быть перезапущен после остановки. Таким образом, вы можете иметь только один процесс или, возможно, один поток.

Вместо запуска трех реакторов вы хотите настроить три разных временных обратных вызова в одном реакторе. Они будут уволены в соответствующее время.

Смежные вопросы