【问题标题】:.join() with a timeout still waits for the daemon thread?.join() 超时仍然等待守护线程?
【发布时间】:2018-08-30 15:24:02
【问题描述】:

来自documentation,特别是这部分:

这会阻塞调用线程,直到其 join() 方法为 调用终止 - 正常或通过未处理的异常 – 或直到发生可选超时

我收集到当timeout 不是None 时,调用线程应该等待守护进程,即退出前的这段时间(如果其他非守护线程完成工作)。虽然,这个例子证明不同,所以我的理解是不正确的:

import threading
import time
import logging


def daemon():
    logging.debug('Starting')
    time.sleep(10)
    logging.debug('Exiting')


def non_daemon():
    logging.debug('Starting')
    logging.debug('Exiting')


logging.basicConfig(
    level=logging.DEBUG,
    format='(%(threadName)-10s) %(message)s',
)

d = threading.Thread(name='daemon', target=daemon, daemon=True)

t = threading.Thread(name='non-daemon', target=non_daemon)

d.start()

t.start()

d.join(0.3)
print('d.isAlive()', d.isAlive())
t.join()

谁能给我解释一下,为什么调用线程(主线程)在等待守护线程0.3秒后没有退出?而是等待完整的10 秒?显然我不明白超时参数的含义。我在网上找到的所有解释都是一样的,基本上都是这样说的:

也可以传递一个浮点数来表示 等待线程变为非活动状态的秒数。如果线程确实 在超时时间内未完成,join() 无论如何都会返回。

,这对我来说毫无意义。

谢谢

【问题讨论】:

    标签: python-3.x multithreading


    【解决方案1】:

    超时参数的意思就是它所说的。 d.join(0.3) 将在线程 d 退出后或 0.3 秒后返回,以先到者为准。如果调用者根据d 是否仍在运行而执行不同的操作很重要,那么它必须调用d.is_alive() 来确定是哪种情况。

    处理明显的竞争条件存在你的问题。

    有人可以向我解释一下,为什么调用线程(主线程)...等待整整 10 秒?

    当我在 Python 3.5.4 中运行您的程序时,情况并非如此。它在不到一秒钟后为我终止,并且从未打印出(daemon ) Exiting。您确定您发布的代码与您正在运行的代码相同吗?

    如果是这样,您使用什么版本的 Python 来运行它?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多