【问题标题】:Twisted `callInThread` is blocking扭曲的`callInThread`正在阻塞
【发布时间】:2015-04-21 23:16:16
【问题描述】:

我有一个基于 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_packet方法会调用我传给构造函数类A的某个协议实例的transport.write方法。请注意,这是一个递归实现,其中 send 方法调用自身以获取以下数据包以通过协议发送。问题是,当它调用 send 延迟 pkt.iat 秒时,send 的执行将在 callInThread 调用处终止,应该产生一个新线程并继续执行 do_some_stuff,对吧??所有这些代码实际上都在另一个扭曲的线程中运行,这意味着在某些时候我们从外部调用callInThread(packet_sender.send, pkt_0)

您对可能发生的事情有任何线索吗?关于 Twisted 线程的工作方式,我是否遗漏了什么?

【问题讨论】:

    标签: python multithreading networking asynchronous twisted


    【解决方案1】:

    self.protocol.transport.write 是反应器中对象的方法。不允许在非反应器线程中调用此方法;行为未定义。阻塞是做未定义的事情的潜在结果之一。一个进程中也不允许有多个反应器线程。

    The twisted documentation on threading 涵盖了这个;也许你应该审查它。您几乎可以肯定根本不需要使用线程来执行您正在尝试做的事情(transport.write 已经非阻塞,因此尝试在线程中执行它无论如何都无济于事);如果您出于某种原因需要线程,此处未显示,也许您应该问一个更具体的问题,即如何避免它们执行该任务。

    【讨论】:

    • 我在文档中找不到反应器和非反应器线程的定义。只是看看我是否理解正确,这是否意味着reactor.callInThread() 将产生一个反应器线程(反应器是reactor)?谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2012-03-07
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多