1.守护进程
守护线程在程序关闭时会突然停止
daemon=True
t = threading.Thread(target=do2, daemon=True)
或者
t = threading.Thread(target=do2)
t.setDaemon(True)
2.join阻塞
如果为线程实例添加t.setDaemon(True)守护进程之后,则主线程执行完成后,会立即退出,而不关注子进程是否执行ok!
那么join恰恰相反,当join出现时,会阻塞主进程,直到join的进程执行完,才能开始后续进程。
来看一个例子,a b c三人合租,a买了一台电视,但其他人想看电视的条件是a学习完了才能看,
import threading
import time
from atexit import register
def study(name, hours):
print("{}今晚学习{}小时".format(name, hours))
time.sleep(hours)
print("{}学完了...".format(name))
def watch_tv():
print("终于能打开电视了...")
time.sleep(2)
@register
def _atexit():
print('看完睡觉,关灯...')
print('c今天不学习...')
print('电视是a买的,a没学完习,你们都不能看')
a = threading.Thread(target=study, args=('a', 5,))
a.start()
b = threading.Thread(target=study, args=('b', 3))
b.start()
# 关注此处join点
a.join()
c = threading.Thread(target=watch_tv)
c.start()
print('啤酒炸鸡走起来!')
3.event事件
def do(event, name):
print('{}号车主就位'.format(name))
event.wait() # 所有线程执行都这里都在等待
event_obj = threading.Event()
for i in range(1, 5):
t = threading.Thread(target=do, args=(event_obj, i))
t.start()
time.sleep(0.1)
print("倒计时")
for i in range(3, 0, -1):
print(i)
time.sleep(1)
event_obj.set()
print('出发')
4.condition条件
import threading
import time
def seeker(cond, name):
time.sleep(2)
cond.acquire()
print('%s :我已经把眼睛蒙上了!' % name)
cond.notify()
cond.wait()
for i in range(2):
print('%s is finding!!!' % name)
time.sleep(1)
cond.notify()
cond.release()
print('%s :哈哈,我赢了!' % name)
def hider(cond, name):
cond.acquire()
cond.wait()
for i in range(2):
print('%s is hiding!!!' % name)
time.sleep(1)
print('%s :我已经藏好了,你快来找我吧!' % name)
cond.notify()
cond.wait()
cond.release()
print('%s :被你找到了,唉~^~!' % name)
cond = threading.Condition()
seeker = threading.Thread(target=seeker, args=(cond, 'seeker'))
hider = threading.Thread(target=hider, args=(cond, 'hider'))
seeker.start()
hider.start()