如何在Python中退出主线程并使子线程在后台继续运行

Posted

技术标签:

【中文标题】如何在Python中退出主线程并使子线程在后台继续运行【英文标题】:How to exit main thread in Python and make the child threads continue in background 【发布时间】:2017-08-24 07:36:25 【问题描述】:

我的目标是让子线程在后台运行,而主线程应该启动它们然后退出:

我尝试了以下代码:

import time
import logging
import threading

logging.basicConfig(filename="threading.log",level=logging.DEBUG)

def worker(count):
    for c in range(count,-1,-1):
        threadname = threading.currentThread().getName()
        threadcount = threading.active_count()
        threadnames = threading.enumerate()
        logging.debug("Child thread:  continuing with threadcount   and counter value: ".format(threadname,threadcount,threadnames,c))
        time.sleep(2)

mainthread = threading.currentThread().getName()
print ("Starting main thread:",mainthread)
t1 = threading.Thread(target=worker,args=(10,))
t1.setDaemon(True)
t1.start()
time.sleep(5)
print ("Attempting to close main thread:",mainthread)

但是一旦主线程退出,我认为子线程也会退出,因为我在 threading.log(我从子线程创建)中有这个输出

DEBUG:root:Child thread: Thread-1 continuing with threadcount 2 [<_MainThread(MainThread, started 1160)>, <Thread(Thread-1, started daemon 10232)>] and counter value: 10
DEBUG:root:Child thread: Thread-1 continuing with threadcount 2 [<_MainThread(MainThread, started 1160)>, <Thread(Thread-1, started daemon 10232)>] and counter value: 9
DEBUG:root:Child thread: Thread-1 continuing with threadcount 2 [<_MainThread(MainThread, started 1160)>, <Thread(Thread-1, started daemon 10232)>] and counter value: 8

我知道使用 join() 不会是答案,因为主线程会阻塞。

我根本不希望主线程阻塞。

这个问题有解决办法吗?

提前致谢。

【问题讨论】:

【参考方案1】:

你做不到,这不是python的问题,而是系统的问题。

如果主进程退出,无论子线程还是子进程都会退出。这是由系统控制的,所以你不能对它做任何事情。

或者你可以改变主意,为什么你必须退出你的主进程?

【讨论】:

【参考方案2】:

您可以将主进程作为守护进程运行并监听一些变量或类似的东西(您可以尝试使用 json) 如果您将关闭主进程,所有其他线程等......将被关闭。

【讨论】:

【参考方案3】:

你应该解释为什么你想要这种行为,因为它不应该是必要的,通过让主线程等待 join 它变成休眠状态,不会比它不存在时消耗更多的功率/内存。 然而,t1.setDaemon(True) 是让子线程在主进程执行时停止的原因,注释掉或删除这一行,它应该做你想做的事。但这也不是好的做法。 示例:

import time
import logging
import threading

logging.basicConfig(filename="threading.log",level=logging.DEBUG)

def worker(count):
    for c in range(count,-1,-1):
        threadname = threading.currentThread().getName()
        threadcount = threading.active_count()
        threadnames = threading.enumerate()
        logging.debug("Child thread:  continuing with threadcount   and counter value: ".format(threadname,threadcount,threadnames,c))
        time.sleep(2)

mainthread = threading.currentThread().getName()
print ("Starting main thread:",mainthread)
t1 = threading.Thread(target=worker,args=(10,))
#t1.setDaemon(True) # do not set daemon
t1.start()
time.sleep(5)
print ("Attempting to close main thread:",mainthread)

【讨论】:

您的代码仍在我的机器中让主线程等待子代码完成。 你是怎么检查的?你的意思是因为控制台没有关闭吗?因为其他线程仍然连接到同一个控制台,所以它为什么不关闭

以上是关于如何在Python中退出主线程并使子线程在后台继续运行的主要内容,如果未能解决你的问题,请参考以下文章

IsBackground的理解

主线程创建了子线程,怎么让主线程退出,而子线程仍然运行

如何防止后台线程抛出的异常让程序崩溃退出

如何在退出前重新附加线程或等待线程完成

设置主线程等待子线程执行的方法

什么是后台线程、前台线程和主线程?