Python 反应堆运行冻结循环
我尝试在多个端口上运行一个扭曲的套接字。下面的代码以前对我有用,但那是大约1个月前的事了,因为如果我没记错的话,从那以后我就再也没有接触过代码了。现在,在我的Twisted程序中重新输入代码后,它就不再工作了Python 反应堆运行冻结循环,python,twisted,Python,Twisted,我尝试在多个端口上运行一个扭曲的套接字。下面的代码以前对我有用,但那是大约1个月前的事了,因为如果我没记错的话,从那以后我就再也没有接触过代码了。现在,在我的Twisted程序中重新输入代码后,它就不再工作了 class Socket(Protocol): table = Table() def connectionMade(self): #self.transport.write("""connected""") self.factory.cl
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次
有什么建议吗?谢谢 您是否收到任何类型的错误消息?你的基本循环没有问题。我建议注释掉下面的所有行
print I
,然后有选择地添加它们,直到循环停止-这将告诉您是什么导致了问题(显然第二次打印不是问题)
可能是listenTCP()
正在挂起等待连接
或者,您可能在正在调用的某个函数中有某种无限循环。要确定w/o是否看到其他代码,唯一的方法是通过注释掉可疑代码并将其重新添加来消除可能出现的问题
更新:根据您的新信息,问题显然在于reactor.run()
。如果代码足够独立,您可以将其发布以供检查
reactor.code()
中存在两个潜在问题,一个无限循环,或者程序正在等待某种事件/输入
循环可能是无限的,也就是说,编码不正确,因此循环开始但从不终止。这看起来好像程序正在暂停/停止(即使CPU正在疯狂地转动)。或者,如果程序正在等待某个输入/事件,它可能会暂停。在到达调试打印之前引发异常 通过使用
try:…包装显示的块来捕获它。。。除了
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"
Twisted程序通常只有一个
反应器运行。请记住,当您启动(.run()
)反应器时,执行会在反应器循环内传递(并且在代码中定义的各种事件,如connectionMade()
,connectionLost()
,dataReceived()
等,在相应操作发生时会触发)。reactor.run()
之后的任何代码都只在reactor停止后执行
因此,您的代码永远不会通过for
循环的第一次迭代
尝试将reactor.run()
移出循环:
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()
# whatever code you put here, is executed only **after reactor has stopped**
reactor.run()中有循环吗?我猜它是这样的,因为它不允许它经过那里。@Levon It打印了9个,然后一旦reactor.run()没有注释,它只打印了0。@run中有一个循环,这是什么意思?我的意思是它可能在reactor.run()中运行一个循环因此for循环没有继续,因为它正在等待reactor.run()完成。问题是,这段代码以前已经运行过了。为什么现在不行?我把所有的东西都注释掉了,然后就没注释了。它从0打印到9,直到我取消了reactor.run()的注释,它只打印了0。@AlecK。反应堆的代码有多大。运行。。你能把它寄出去吗?它是否有一个循环(可能是无限的),或者正在等待什么?+1;我也在想同样的事情,不过如果看不到更多的代码就很难说。我在0弹出后建立了一个连接,但除了它说我已连接之外,什么也没发生。@Levon:你猜得对,Twisted是一个asychrovous(事件驱动)框架。所以“心脏”实际上是一个无限循环,等待事件/输入发生。它会永远运行,或者直到它通过执行内部方法(reactor.stop()
)停止。这难道不是在循环中的所有设置上保持循环,甚至不运行反应器吗?它会循环(10次),然后启动反应器(一次)。我刚做了,循环从0到9,我连接到端口1025,它成功了。连接到1031,它工作了。但现在我的问题是…是只有一个工厂在反应堆中运行并且监听多个端口,还是反应堆在不同的端口上运行不同的工厂?你的代码表明你已经建立了10个工厂,每个端口一个。好吧,那么我想这就解决了。我简直不敢相信我竟然没想过要移动那条线。谢谢你!