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