反应堆比我预期的更早停止?

时间:2010-10-03 22:46:14

标签: python twisted

感谢this tutorial和其他许多人,我正在努力教自己一些基本的Twisted编程。我来到这个当前的例子,我无法弄清楚为什么它正在做它正在做的事情。

简短摘要:我已经实例化了三个反应堆,这些反应堆的数量从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 个答案:

答案 0 :(得分:1)

我不熟悉扭曲,但是从浏览谷歌搜索结果看起来反应堆是一个事件循环。你只有其中一个,所以第一个命中reactor.stop()的计数器会停止循环。

要做你想做的事,你需要删除reactor.stop()调用和结构的东西,这样当最后一个计时器到达它结束时,只有它,调用reactor.stop()

答案 1 :(得分:0)

他在part 3中谈到了一点。你可能会混淆“在一台服务器上启动三个反应堆”和“启动三个不同的服务器”。这些例子建议做后者;你的代码试图做前者。

基本上反应堆是singleton,一旦停止就无法重启。因此,每个进程只能有一个,或者每个进程可以有一个。

您希望在同一个反应堆上设置三个不同的定时回调,而不是启动三个反应堆。他们都会在适当的时候被解雇。