Python 扭曲的'callInThread'正在阻塞
我有一个基于Twisted的程序,我在以下摘录中对其进行了简化:Python 扭曲的'callInThread'正在阻塞,python,multithreading,networking,asynchronous,twisted,Python,Multithreading,Networking,Asynchronous,Twisted,我有一个基于Twisted的程序,我在以下摘录中对其进行了简化: class PacketSender(object): def __init__(self, protocol_instance): self._stop = False self._protocol = protocol_instance def send(self, pkti): try:
class PacketSender(object):
def __init__(self, protocol_instance):
self._stop = False
self._protocol = protocol_instance
def send(self, pkti):
try:
pkti1 = gen_packets.next()
reactor.callInThread(self.write_packet, pkti)
except StopIteration:
self._stop = True
do_some_stuff()
if not self._stop:
reactor.callLater(pkti.iat, self.send, pkti1)
def write_packet(self, pkt):
self.protocol.transport.write(pkt)
...
reactor.run()
综上所述,write\u packet
方法将调用我传递给构造函数类a
的某个协议实例的transport.write
方法。注意,这是一个递归实现,其中方法send
调用自身,以获得通过协议发送的以下数据包。问题是,当它调用send
delayedpkt.iat
秒时,send的执行将在callInThread
调用时停止,这应该会产生一个新线程,并继续执行do\u some\u stuff
,对吗??所有这些代码实际上都是在另一个扭曲线程中运行的,这意味着在某个时刻,我们正在从外部调用callInThread(packet\u sender.send,pkt\u 0)
你对可能发生的事情有什么线索吗?Twisted threads是如何工作的,我还缺少什么吗?self.protocol.transport.write是反应器中对象的一种方法。不允许在非反应器线程中调用此方法;该行为未定义。阻塞是做未定义的事情的一个潜在结果。一个进程中也不允许有多个reactor线程
包括这一点;也许你应该复习一下。几乎可以肯定的是,您根本不需要使用线程来完成所要做的事情(
transport.write
已经是非阻塞的,因此尝试在线程中执行它也不会有任何帮助);如果出于此处未显示的某些原因需要线程,可能您应该问一个更具体的问题,关于如何在该任务中避免线程。self.protocol.transport.write是反应器中对象的一种方法。不允许在非反应器线程中调用此方法;该行为未定义。阻塞是做未定义的事情的一个潜在结果。一个进程中也不允许有多个reactor线程
包括这一点;也许你应该复习一下。几乎可以肯定的是,您根本不需要使用线程来完成所要做的事情(
transport.write
已经是非阻塞的,因此尝试在线程中执行它也不会有任何帮助);如果您出于某种原因需要线程(此处未显示),也许您应该问一个更具体的问题,关于如何在该任务中避免线程。我在文档中找不到反应器线程和非反应器线程的定义。看看我是否理解正确,这是否意味着reactor.callInThread()
将生成一个reactor线程(reactor位于reactor
)?谢谢,我在文档中找不到反应线程和非反应线程的定义。看看我是否理解正确,这是否意味着reactor.callInThread()
将生成一个reactor线程(reactor位于reactor
)?非常感谢。