我有以下Python脚本:
脚本.py
from threading import Thread
def func():
while True:
pass
a = Thread(target=func)
a.start()
print('started the thread')
当从终端 (
python script.py
) 运行它时,它会打印 started the thread
并挂在那里。从 C
背景来看,我知道当主线程完成时,其余线程也会终止。 Python 中不也是这样吗?即使不调用 a.join()
,Python 也会等待吗? python中有主线程的概念还是所有线程都是相同的?
Python中有一个“主线程”,一般就是启动Python解释器的线程。由
threading
模块创建的线程在本机操作系统线程之上具有一些行为层。其中一种行为是,当解释器退出时,正常关闭处理的一部分是主线程加入每个非守护进程 threading.Thread
- 所以,是的,Python 通常会等待所有其他线程结束。
Python 退出时是否强制关闭守护进程
threading.Thread
取决于操作系统,尽管我相信现在所有主要操作系统都会杀死它们。
如果您想退出解释器,无论非守护进程
threading.Thread
是否正在运行,您都需要终止该作业,或调用os._exit()
。注意前导下划线!不推荐,但如果你需要的话,还是有的。
我认为这里的一个例子会对那些在 Python 中的默认线程行为中苦苦挣扎的人有所帮助:
import time
import threading as t
def dotask1():
print("Starting task1")
time.sleep(3)
print(f"Done with task1 in thread {t.current_thread().name}")
def dotask2():
print("Starting task2")
time.sleep(1)
print(f"Done with task2 in thread {t.current_thread().name}")
def dotask3():
print("Starting task3")
time.sleep(2)
print(f"Done with task3 in thread {t.current_thread().name}")
def main():
t.Thread(None, dotask1).start()
t.Thread(None, dotask2).start()
t.Thread(None, dotask3).start()
if __name__ == "__main__":
main()
请注意,当您运行此示例时,应用程序将等待所有三个线程终止。 对于大多数期望应用程序终止的 C/C++ 程序员来说,这将是违反直觉的。 主线程等待(加入)每个线程,然后终止。
尚未有人提到的(也许)有用的部分是,我们可以通过创建如下所示的线程来获得类似 C 的行为:
def main():
t.Thread(None, dotask1, daemon=True).start()
t.Thread(None, dotask2, daemon=True).start()
t.Thread(None, dotask3, daemon=True).start()
重新运行代码,您将发现您期望的行为。 应用程序将在线程有机会完成之前终止。