python - 尽管主程序已完成,守护线程仍不退出

标签 python multithreading

我已经提到过这个帖子,但它似乎已经过时了 似乎没有一个明确的解释

Python daemon thread does not exit when parent thread exits

我正在运行 python 3.6 并尝试从 IDLE 或 Spyder IDE 运行脚本。

这是我的代码:

import threading
import time

total = 4

def creates_items():
    global total
    for i in range(10):
        time.sleep(2)
        print('added item')
        total += 1
    print('creation is done')


def creates_items_2():
    global total
    for i in range(7):
        time.sleep(1)
        print('added item')
        total += 1
    print('creation is done')


def limits_items():

    #print('finished sleeping')

    global total
    while True:
        if total > 5:

            print ('overload')
            total -= 3
            print('subtracted 3')
        else:
            time.sleep(1)
            print('waiting')


limitor = threading.Thread(target = limits_items, daemon = True)
creator1 = threading.Thread(target  = creates_items)
creator2 = threading.Thread(target = creates_items_2)


print(limitor.isDaemon())


creator1.start()
creator2.start()
limitor.start()


creator1.join()
creator2.join()

print('our ending value of total is' , total)

尽管是守护线程,限制器线程似乎并未结束。

这是从 IDLE 或 Spyder 开始工作的方法吗?

谢谢。

最佳答案

我遇到了同样的问题,并通过使用多处理而不是线程解决了它:

from multiprocessing import Process
import multiprocessing
from time import sleep

def daemon_thread():
    for _ in range(10):
        sleep(1)
        print("Daemon")

if __name__ == '__main__':
    multiprocessing.freeze_support()
    sub_process = Process(target = daemon_thread, daemon = True)
    sub_process.start()

    print("Exiting Main")

我还没有真正理解为什么我需要调用 freeze_support() 但它使代码可以工作。

关于python - 尽管主程序已完成,守护线程仍不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44832070/

相关文章:

python - Python 路径在哪里被操作?

java - 在使用 Jena (java) 或 RDFLib (python) 时,我应该如何确定是将本体打开为 'turtle' 还是 'xml' ?

java - newCachedThreadPool如何缓存线程

c# - 尝试使用异步方法访问 Thread.CurrentPrincipal 时出现 ObjectDisposedException

C# - 何时在高事件服务器中使用标准线程、ThreadPool 和 TPL

python - 共享轴并删除 matplotlib 子图中未使用的

python - 计算df中 '1'的数量

python - 如何使用 sys excepthook,然后在错误消息后从循环中继续代码?

c++ - 确定 Windows 线程是否位于关键部分或类似区域?

java - 重新获取锁