线程同步之Event


01.线程同步指通过某种技术,让一个线程访问某些数据时,其他线程不能访问这些数据,直到线程完成对数据的操作。

  • 不同操作系统实现线程同步技术有所不同,具体分为:
    • 临界区(critical section)。
    • 互斥量(mutex)。
    • 信号量(semaphore)。
    • 事件(event)。


02.event事件:

  • event事件是线程间通信机制中最简单的实现,使用一个内部的标记flag,通过flag的布尔值变化来进行操作。
  • event类的方法包括:
    • set(),标记设置为True。
    • clear(),标记设置为False。
    • is_set(),标记是否为True。
    • wait(timeout=None),设置等待标记为True的时长,None为无限等待;等到了返回True,未等到返回False。
  • event类的示例:
import threading
import time
import random


job = {'count': 0}
event = threading.Event()
flag = True


def worker(count=100):
    global flag
    print("I am working")
    while flag:
        time.sleep(random.uniform(0.05, 0.1))
        job['count'] = job['count'] + 1
        print("Jobs already done {}/100".format(job['count']))

        if job['count'] >= count:
            event.set()
            break


def boss():
    global flag
    if event.wait(7):
        print("Well Done")
    else:
        print("Its already 20 seconds, timeout!")
        flag = False


w = threading.Thread(name='worker', target=worker, daemon=False)
b = threading.Thread(name='boss', target=boss, daemon=False)
w.start()
b.start()
  • Event.wait()方法会阻塞线程,直到标记被设置为True,或者等待的时间结束而被设置为False。
  • Event.wait()方法优于time.sleep,它会更快的切换到其他线程,提高并发效率。
文档更新时间: 2021-10-04 00:19   作者:闻骏