如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的 daemon 属性。

即在线程开始(thread.start ())之前,调用 setDeamon()函数,设定线程的 daemon 标志。

(thread.setDaemon (True))就表示这个线程 “不重要”。

如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用 thread.setDaemon (False),设置 daemon 的值为 false。新的子线程会继承父线程的 daemon 标志。

整个 Python 会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束。

setDaemon () 函数要放在 start 之前设置才行。

import threading
import time

def func():
    print("子线程开启:", time.localtime())
    time.sleep(2)
    print("子线程结束:", time.localtime())


print("主线程开启:", time.localtime())
t = threading.Thread(target=func, args=())
# t.setDaemon(True)
t.start()
print("主线程关闭:", time.localtime())

在 Python 的多线程编程中,在实例代码中经常有 thread1.join () 这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。

join 的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的 join 函数。

先看看这个:

  1. 阻塞主进程,专注于执行多线程中的程序。
  2. 多线程多 join 的情况下,依次执行各线程的 join 方法,前头一个结束了才能执行后面一个。
  3. 无参数,则等待到该线程结束,才开始执行下一个线程的 join。
  4. 参数 timeout 为线程的阻塞时间,如 timeout=2 就是罩着这个线程 2s 以后,就不管他了,继续执行下面的代码。
  5. 下面的例子是一次阻塞子线程,每个子线程都会等上个子线程 join 结束才会执行,如果注释掉 t.join 则会同时执行 5 个子线程,多线程在做网络访问的时候可以减少等待时间,那么在一个工作流程中可以将访问网络接口的情况做成多线程。
import threading, time

def func():
    print("hello world!")
    time.sleep(1)

print("hello main start")
for i in range(5):
    t = threading.Thread(target=func, args=())
    print(t.getName())
    t.start()
    t.join()