Остановка реактора раньше, чем я ожидал? - PullRequest
2 голосов
/ 04 октября 2010

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

Краткое резюме: Я создал три реактора с обратным отсчетом от 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 здесь?

Ответы [ 2 ]

1 голос
/ 04 октября 2010

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

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

0 голосов
/ 04 октября 2010

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

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

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

...