前言丨

今天请zhang和yang吃火锅,吃完火锅的时候会有以下三种场景:

场景一:小虫子(主)先吃完了,zhang(客)和yang(客)还没吃完,这种场景会导致结账的人先走了,剩下两位客人。

场景二:小虫子(主)先吃完了,zhang和yang还没吃饱,一起结账走人。

场景三:小虫子(主)先等zhang和yang吃饱了,最后结账一起走人。

首先需要明确几个概念:

知识点一:

当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。(对应场景一)

知识点二:

当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止。(对应场景二)

知识点三:

此时join的作用就凸显出来了,**join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止。(对应场景三)


主线程与子线程

场景一:主线程已经结束了,子线程还在跑

1.我们把thread1.start()和thread2.start()称为两个子线程,写在外面的代码就是主线程了。




python 如何根据子线程名称结束线程 python子线程不阻塞主线程_守护线程


2.运行结果:


python 如何根据子线程名称结束线程 python子线程不阻塞主线程_主线程_02


守护线程setDaemon()

场景二:主线程结束了,子线程必须也跟着结束

1.主线程中,创建了子线程thread1和thread2,并且在主线程中调用了thread.setDaemon(),这个的意思是把主线程设置为守护线程,这时候要是主线程执行结束了,就不管子线程是否完成,一并和主线程退出。
(敲黑板:必须在start()方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。)

2.线程有一个布尔属性叫做daemon,表示线程是否是守护线程,默认取否。当程序中的线程全部是守护线程时,程序才会退出,只要还存在一个非守护线程,程序就不会退出。

主线程是非守护线程。

3.setDaemon(True)此方法里面参数设置为True才会生效


python 如何根据子线程名称结束线程 python子线程不阻塞主线程_主线程_03


4.运行结果:


python 如何根据子线程名称结束线程 python子线程不阻塞主线程_子线程_04


阻塞主线程join(timeout)

1.如果想让主线程等待子线程结束后再运行的话,就需要用到join(),此方法是在start之后(与setDaemon相反)

2.join(timeout)此方法有个timeout参数,是线程超时时间设置。


python 如何根据子线程名称结束线程 python子线程不阻塞主线程_主线程_05


运行结果:


python 如何根据子线程名称结束线程 python子线程不阻塞主线程_子线程_06


参考代码:


python 如何根据子线程名称结束线程 python子线程不阻塞主线程_主线程_07