python 会等待所有线程完成后再退出吗?

问题描述 投票:0回答:2

我有以下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-3.x multithreading
2个回答
1
投票

Python中有一个“主线程”,一般就是启动Python解释器的线程。由

threading
模块创建的线程在本机操作系统线程之上具有一些行为层。其中一种行为是,当解释器退出时,正常关闭处理的一部分是主线程加入每个非守护进程
threading.Thread
- 所以,是的,Python 通常会等待所有其他线程结束。

Python 退出时是否强制关闭守护进程

threading.Thread
取决于操作系统,尽管我相信现在所有主要操作系统都会杀死它们。

如果您想退出解释器,无论非守护进程

threading.Thread
是否正在运行,您都需要终止该作业,或调用
os._exit()
。注意前导下划线!不推荐,但如果你需要的话,还是有的。


0
投票

我认为这里的一个例子会对那些在 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()

重新运行代码,您将发现您期望的行为。 应用程序将在线程有机会完成之前终止。

© www.soinside.com 2019 - 2024. All rights reserved.