Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 扭曲的'callInThread'正在阻塞_Python_Multithreading_Networking_Asynchronous_Twisted - Fatal编程技术网

Python 扭曲的'callInThread'正在阻塞

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:

我有一个基于Twisted的程序,我在以下摘录中对其进行了简化:

    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
delayed
pkt.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
)?非常感谢。