【问题标题】:Thread randomly stops in Python线程在 Python 中随机停止
【发布时间】:2016-04-18 16:53:35
【问题描述】:

我一直在玩 Python 中的线程,并通过以下代码发现了一些有趣的东西:

import time
import threading

class Update(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.stop_event = threading.Event()

  def join(self, timeout=None):
    self.stop_event.set()
    threading.Thread.join(self, timeout)

  def run(self):
    while not self.stop_event.isSet():
      print("test")

thread = Update()
thread.start()

即使我不调用 join() 方法,此代码也会随机停止。结果,我得到了不同的输出,如下所示:

test@debian:~/$ python3 test.py
test
test
test
test
test@debian:~/$ python3 test.py
test
test
test
test
test
test
test
test@debian:~/$ python3 test.py
test
test

为什么这段代码会随机停止?我以为只有设置 stop_event 这个线程才会停止。

【问题讨论】:

  • 请注意打印不是线程安全的:stackoverflow.com/questions/18234469/…
  • @JoãoPinto:这个问题实际上与线程安全无关。它甚至不使用任何线程;相反,它分叉了一堆进程,我认为这些进程与问题没有任何关系。
  • 评论不是答案,我的评论是在用户尝试使用打印到标准输出来调试多线程应用程序的上下文中提供的。

标签: python multithreading


【解决方案1】:

您已经得到了基本答案,但是您需要注意一个细节:当主程序结束时,作为关闭处理的一部分,.join() 在由threading 模块创建的所有非守护线程上的 Python 调用.你覆盖了.join(),所以 Python 调用 your .join()。这反过来会设置事件,因此您的 .run() 方法会静默退出。

【讨论】:

  • 所以这就是非守护线程不阻塞关机的原因。这说得通; Python 需要等待非守护线程完成,因此它会调用专门为等待线程完成而设计的方法。
  • 另外,很容易证明这就是发生的事情 - 将 print 语句添加到 join 方法,您会看到 join 方法被调用。
【解决方案2】:

main 线程结束时,程序结束。

线程在主线程停止之前循环的次数是相当随意的。 (由操作系统安排)

【讨论】:

  • docs 表示所有非守护线程需要在程序结束前结束。
  • @user2357112 是的,我只是在寻找垃圾收集在程序结束时关闭线程的证据,但似乎垃圾收集与它无关,TimPeters 提供了线程如何处理的正确答案已关闭。
猜你喜欢
  • 1970-01-01
  • 2012-01-14
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多