如何无限期地干净地睡觉?

2024-04-27 04:06:08 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中启动了几个线程,我需要在脚本的末尾无限期地休眠,而不是这种睡眠对性能的重大影响1。在

一种可能的方法是用短暂的睡眠来无限循环:

while True:
    time.sleep(1)

或者睡很长时间

^{pr2}$

或者

import signal
signal.pause()

但是:

  • 我没有找到睡眠所能接受的最大时间(sys.maxint太大)

  • signal.pause()仅在Unix中实现

  • 第一个“睡眠循环”在我看来并不干净(为什么是1秒而不是10秒,或者0.1?)

有没有一种干净的Python式的方法可以无限期地入睡?


1我不直接控制线程,否则我会选择^{},因为线程本身不会结束。在


Tags: 方法代码import脚本truesignaltimesleep
1条回答
网友
1楼 · 发布于 2024-04-27 04:06:08

^{}提供所有正在运行的线程的列表,包括主线程,因此可以执行以下操作:

main_thread = threading.main_thread()
while True:
    L = threading.enumerate()
    L.remove(main_thread)  # or avoid it in the for loop
    for t in L:
        t.join()

如果库在等待当前线程完成时创建新线程,则需要使用while True。在

假设在enumerate运行时没有创建线程,可以检查L是否只有一个元素(主线程),如果是,则中断循环。这与Tadhg McDonald-Jensensuggestion结合使用^{}和一个哨兵,结果是:

^{pr2}$

enumerate以未定义的顺序返回一个列表,因此,如果您有多个“main”线程,顺序就开始重要了。解决方案是使用sets,即main_threads = {main_thread, }和{}。在

如果您更喜欢请求原谅的EAFP方法,而不是请求许可,并且当您到达脚本末尾时,所有线程都将启动,您还可以执行以下操作:

for thread in threading.enumerate():
    try:
        thread.join()
    except RuntimeError:
        # trying to join the main thread, which would create a deadlock (see https://docs.python.org/3/library/threading.html#threading.Thread.join for details)
        pass

相关问题 更多 >