多线程threading.Event对象

2020年6月20日 / 5次阅读 / Last Modified 2020年6月20日
多线程

python多线程事件对象,threading.Event。

具体什么事件,是程序员定义的,不同的事件使用不同的event对象来控制。每个event对象只有几个简单的接口,set, clear, wait, is_set。https://docs.python.org/3/library/threading.html#event-objects

默认情况下wait是block的,按照python的风格,可以设置一个timeout。

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次打印不全都一样!

-- EOF --

本文链接:https://www.pynote.net/archives/2070

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top