是否必须从同一个线程创建线程并将其连接回同一个线程?

Does a thread have to be created from and join back to the same thread?

我有一个 Python 脚本,它使用 RabbitMQ 和 pika 模块从客户端接收消息。给定消息 "enable",脚本需要 运行 新线程中的方法,给定消息 "disable",以 "enable" 开始的线程现在需要终止.

但是,每次收到消息时,pika 都会触发一个回调方法,我假设它在一个新线程中 运行s,一旦消息处理完毕,回调线程就会终止。

在那种情况下,不同线程中的两个回调启动和终止另一个线程。我注意到当我尝试 join() 时,我得到:

File "/usr/lib/python2.7/threading.py", line 940, in join
  raise RuntimeError("cannot join current thread")

有没有规定同一个线程启动另一个线程也必须join()呢?还是我误解了问题?

我最初认为该错误意味着一个线程正在尝试加入自身,但我确信情况并非如此,并且自从两个不同的线程开始创建和终止同一个线程后问题就开始了。

来自threading documentation

join() raises a RuntimeError if an attempt is made to join the current thread as that would cause a deadlock. It is also an error to join() a thread before it has been started and attempts to do so raise the same exception.

你误解了这个问题。错误消息告诉您线程正在尝试加入 自身 。基本上是这样的:

def run():
    thread.join()

thread= Thread(target=run)
thread.start()

这显然没有任何意义。因此抛出异常。


至于修复这个错误:在不知道你的程序在做什么的情况下很难说你做错了什么。如果您删除对 .join() 的调用,您的代码可能会正常工作,或者可能是您在错误的线程上调用 .join()。你必须自己调试它。