Reactor.run冻结循环

时间:2012-06-02 21:24:36

标签: python twisted

我有一个Twisted套接字,我试图在多个端口上运行。以下代码之前对我有用,但那是大约1个月前,因为我没有触及代码,因为我记得正确。现在,在将代码重新输入我的Twisted程序后,它不再起作用了。

class Socket(Protocol):
    table = Table()

    def connectionMade(self):
        #self.transport.write("""connected""")
        self.factory.clients.append(self)
        print "Clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def dataReceived(self, data):
        #print "data is ", data
        a = data.split(':')
        if len(a) > 1:
            command = a[0]
            content = a[1]

            if command == "Number_of_Players":
                msg = table.numberOfPlayers


        print msg

        for c in self.factory.clients:
                c.message(msg)

    def message(self, message):
        self.transport.write(message)

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)
    #print "Blackjack server started"
    reactor.run()

它通常会在我设置的范围内多次打印Blackjack服务器,但现在却没有。为了测试它是否在循环,我开始打印i,但它只打印0.由于某种原因,for循环只循环1次。

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:5)

扭曲的程序通常只有一个reactor在运行。请记住,当您启动(.run())reactor时,执行会在reactor循环内部传递(以及您在代码中定义的各种事件,例如connectionMade()connectionLost(),{当发生相应的动作时会触发{1}}等。在反应堆停止后<{1}}仅执行之后的任何代码

因此,您的代码永远不会通过dataReceived()循环的第一次迭代。

尝试将reactor.run()移出循环:

for

答案 1 :(得分:2)

您是否收到任何类型的错误消息?你的基本循环没有任何问题。我建议评论print i下面的所有行,然后有选择地将它们添加回来直到循环停止 - 这将告诉你导致问题的原因(显然第二次打印不是问题)

也许listenTCP()正在等待连接?

或者你可能在其中一个函数中有某种无限循环。只有这样才能确定没有看到其他代码是通过注释掉可疑代码并将其重新添加来消除可能的问题。

更新:根据您的新信息,问题显然是reactor.run()。如果代码足够自足,您可以将其发布以供检查。

reactor.code()无限循环中的两个潜在问题,或者某个事件/输入程序等待

循环可以是无限的,即编码不正确,以便它开始但永远不会终止。这看起来好像程序正在暂停/停止(即使CPU正在疯狂地发动)。或者,如果程序正在等待某些输入/事件,程序可能会暂停。

答案 2 :(得分:1)

在您到达调试打印之前抛出了异常。

通过使用try: ... except包装显示的块来抓住它。

try:
       reactor.listenTCP(1025+i, factory)
except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except:
    print "something else happened"