时间:2021-05-22
这篇文章主要介绍了python主线程与子线程的结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
引用自 主线程退出对子线程的影响 的一段话:
对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程。
主线程退出后子线程的状态依赖于它所在的进程,如果进程没有退出的话子线程依然正常运转。如果进程退出了,那么它所有的线程都会退出,所以子线程也就退出了。
主线程退出,进程等待所有子线程执行完毕后才结束
进程启动后会默认产生一个主线程,默认情况下主线程创建的子线程都不是守护线程(setDaemon(False))。因此主线程结束后,子线程会继续执行,进程会等待所有子线程执行完毕后才结束
所有线程共享一个终端输出(线程所属进程的终端)
import threadingimport timedef child_thread1(): for i in range(100): time.sleep(1) print('child_thread1_running...')def parent_thread(): print('parent_thread_running...') thread1 = threading.Thread(target=child_thread1) thread1.start() print('parent_thread_exit...')if __name__ == "__main__": parent_thread()输出为:
parent_thread_running...parent_thread_exit...child_thread1_running...child_thread1_running...child_thread1_running...child_thread1_running......可见父线程结束后,子线程仍在运行,此时结束进程,子线程才会被终止
主线程结束后进程不等待守护线程完成,立即结束
当设置一个线程为守护线程时,此线程所属进程不会等待此线程运行结束,进程将立即结束
import threadingimport timedef child_thread1(): for i in range(100): time.sleep(1) print('child_thread1_running...')def child_thread2(): for i in range(5): time.sleep(1) print('child_thread2_running...')def parent_thread(): print('parent_thread_running...') thread1 = threading.Thread(target=child_thread1) thread2 = threading.Thread(target=child_thread2) thread1.setDaemon(True) thread1.start() thread2.start() print('parent_thread_exit...')if __name__ == "__main__": parent_thread()输出:
parent_thread_running...parent_thread_exit...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...child_thread2_running...child_thread1_running...Process finished with exit code 0thread1是守护线程,thread2非守护线程,因此,进程会等待thread2完成后结束,而不会等待thread1完成
注意:子线程会继承父线程中daemon的值,即守护线程开启的子线程仍是守护线程
主线程等待子线程完成后结束
在线程A中使用B.join()表示线程A在调用join()处被阻塞,且要等待线程B的完成才能继续执行
import threadingimport timedef child_thread1(): for i in range(10): time.sleep(1) print('child_thread1_running...')def child_thread2(): for i in range(5): time.sleep(1) print('child_thread2_running...')def parent_thread(): print('parent_thread_running...') thread1 = threading.Thread(target=child_thread1) thread2 = threading.Thread(target=child_thread2) thread1.setDaemon(True) thread2.setDaemon(True) thread1.start() thread2.start() thread2.join() 1/0 thread1.join() print('parent_thread_exit...')if __name__ == "__main__": parent_thread()输出:
parent_thread_running...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...child_thread1_running...child_thread2_running...Traceback (most recent call last): File "E:/test_thread.py", line 31, in <module> parent_thread() File "E:/test_thread.py", line 25, in parent_thread 1/0ZeroDivisionError: integer division or modulo by zero主线程在执行到thread2.join()时被阻塞,等待thread2结束后才会执行下一句
1/0 会使主线程报错退出,且thread1设置了daemon=True,因此主线程意外退出时thread1也会立即结束。thread1.join()没有被主线程执行
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、主线程会等待所有的子线程结束后才结束首先我看下最普通情况下,主线程和子线程的情况。importthreadingfromtimeimportsleep,ct
其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿。那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的
在Android中,只有主线程才能操作UI,但是主线程不能进行耗时操作,否则会阻塞线程,产生ANR异常,所以常常把耗时操作放到其它子线程进行。如果在子线程中需要
1.题目:主线程执行10次,子线程执行10次,此过程重复50次代码:packagecom.Thread.test;/**function:主线程执行10次,子线
在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,做法如下://在使用多线程过程中,可能会遇到在一些情况下必须等待子线程