2020年6月20日 / 1,788次阅读 / Last Modified 2020年12月4日
多线程
python多线程事件对象,threading.Event。
具体什么事件,是程序员定义的,不同的事件使用不同的event对象来控制。每个event对象只有几个简单的接口,set, clear, wait, is_set。https://docs.python.org/3/library/threading.html#event-objects
默认情况下wait是block的,按照python的风格,可以设置一个timeout!这个机制,可以实现一种小于等于某个时间长度的等待。(time.sleep是等待一个固定的时间长度)
event这种多线程同步模型,可以轻松实现多个线程等待同一个event的场景。一个线程set,其它所有线程wait。(我有的时候喜欢用一个变量来代替event,比如只有一个线程用来改变这个变量的值,其它所有线程只是读取值)
$ cat t_event.py
import threading
import time
event_xh = threading.Event()
def _worker(index):
event_xh.wait()
print(index)
if event_xh.is_set():
event_xh.clear()
t_list = []
for i in range(10):
t = threading.Thread(target=_worker, args=(i,))
t_list.append(t)
t.start()
time.sleep(10)
event_xh.set()
运行这段代码,你会看到程序会先等待10秒钟,然后随机打印出0-9的数字。这说明10个线程都在等待event_xh这个事件,直到set后,打印并结束自己。
pi@rpi01:~/test $ python3.8 t_event.py
3
1
2
6
5
7
8
0
4
9
pi@rpi01:~/test $ python3.8 t_event.py
3
1
2
6
5
9
0
7
8
4
pi@rpi01:~/test $ python3.8 t_event.py
3
1
4
6
0
8
5
9
2
7
线程的执行有一定的随机性,因此上面的3次打印不全都一样!
看到有人在公众号里面,专门介绍这个机制。使用threading.Event对象的wait函数,带个timeout参数,可以实现等待时间小于等于某个时间长度。
当代码流程进入event.wait的阻塞时,这个阻塞会在event.set后开始继续,如果event.wait(TIMEOUT),那么阻塞的等待时间,就是 <= TIMEOUT。
这个机制有些时候能够很好的优化代码逻辑。
-- EOF --
本文链接:https://www.pynote.net/archives/2070
©Copyright 麦新杰 Since 2019 Python笔记