一、setDaemon(True)
1、改方法将线程申明为守护线程,必须在start()方法之前设置
2、当我们在程序运行时,执行一个主线程,如果主线程又创建一个子线程,那么子线程和主线程兵分两路,分别运行;那么当主线程运行结束时会检查子线程是否完成,如果子线程未完成,那么主线程会等待子线程完成后一起退出
3、但是有时候不想等待子线程是否完成,只要主线程完成就直接退出,这时候就可以将子线程设置为守护线程,子线程守护主线程,不管自己的死活(当舔狗),于是就可以给子线程打上setDeamon()的标签。这样看到setDeamon()标志的线程就知道它是主线程舔狗
import threading
import time
from time import ctime
def sing():
print("begin to sing %s" % time.ctime())
time.sleep(3)
print("stop to sing %s" % time.ctime())
def jump():
print("begin to jump %s" % time.ctime())
time.sleep(5)
print("stop to jump %s" % time.ctime())
threads = []
t1 = threading.Thread(target = sing)
t2 = threading.Thread(target = jump)
threads.append(t1)
threads.append(t2)
if __name__ == '__main__':
t2.setDaemon(True)#将t2设置成舔狗线程,
for t in threads:
t.start()
print("all over %s" % ctime())
t2没有打印出stop,因为主线程和t1一起结束了。t1不是舔狗,所以主线程等待着t1一起结束线程,而不管t2怎么样。
如果将t1也设置成守护线程那么得到的图是
if __name__ == '__main__':
t1.setDaemon(True)
t2.setDaemon(True)
for t in threads:
t.start()
print("all over %s" % ctime())
主线程和begin一起开始,然后直接结束主线程,不管t1\t2是否执行完毕
二、join()方法
在子线程完成运行之前,这个子线程的父类进程一直被阻塞
import threading
import time
from time import ctime
def sing():
print("begin to sing %s" % time.ctime())
time.sleep(3)
print("stop to sing %s" % time.ctime())
def jump():
print("begin to jump %s" % time.ctime())
time.sleep(5)
print("stop to jump %s" % time.ctime())
threads = []
t1 = threading.Thread(target = sing)
t2 = threading.Thread(target = jump)
threads.append(t1)
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.start()
t1.join()#先执行子线程t1的内容,
print("all over %s" % ctime())
t1.join(),让代码先执行t1的内容,不执行主线程的print(),主线程一直被阻塞,直到t1完成之后才开始执行主线程
2.只有当t1执行完毕后,才执行主线程和t2子线程