多线程threading.Event对象

2020年6月20日 / 286次阅读 / 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次打印不全都一样!

设置Event等待时间小于等于某个时间长度

看到有人在公众号里面,专门介绍这个机制。使用threading.Event对象的wait函数,带个timeout参数,可以实现等待时间小于等于某个时间长度。

当代码流程进入event.wait的阻塞时,这个阻塞会在event.set后开始继续,如果event.wait(TIMEOUT),那么阻塞的等待时间,就是 <= TIMEOUT。

这个机制有些时候能够很好的优化代码逻辑。

-- EOF --

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

留言区

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


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top