第54天:Python 多线程 Event

简介: 第54天:Python 多线程 Event

Event(事件)


Event 是一个事务处理的机制,用于通知多个异步任务某个事件已经发生了。比如在交通红绿灯中多辆在行驶中的汽车可以表示成程序中的多个异步任务,红绿灯的亮起可以表示成一个通知,红灯通知这个汽车的行驶任务必须停止了,绿灯通知这个汽车的行驶任务可以继续驾驶了。


Event 管理着一个全局的内部标志 flag,该 flag 默认为 False,当 flag 等于 False 的时候,调用 wait() 函数后程序就会被阻塞,只有当 flag 等于 True 的时候程序才会继续执行。在红绿灯中红灯相当于 flag 等于 False 的时候调用了 wait() 函数,绿灯相当于 flag 被设置为了 True,汽车允许通行,程序被允许执行 wait()之后的代码。


Event事件对象


Event 通过 threading 模块的 Event() 类创建对象


event = threading.Event()


Event 是一个低配版的 Condition,在源代码 init 函数中创建了 Condition 对象,并将 flag 设置为 False


def __init__(self):    self._cond = Condition(Lock())    self._flag = False


函数


Event 事件中只有4个函数:


  1. set(): 将 flag 设为 True,通知所有处于阻塞状态的线程恢复运行状态。


  1. clear(): 将 flag 设为 False。


  1. wait(timeout): 如果 flag 为 True 将立即返回,否则线程将处于阻塞状态,等待其他线程将 flag 设置为 True


  1. isSet(): 获取 flag 的状态,返回 True 或 False。


实例1


用行驶中的汽车碰到红绿灯做一个实例,红灯事件汽车停止不允许通行处于等待阻塞状态,绿灯事件汽车运行通行处于恢复运行状态。


import threadingimport time
event = threading.Event()
def drive(name):    i = 0    while True:        i = i + 1        print(name + "正在行驶中,行驶了" + str(i * 60) + "Km")        time.sleep(1)        event.wait()        print(name + "通过了红灯")
def sign():    print("绿灯初始化")    event.set()    while True:        # 红绿灯切换时间为3秒        time.sleep(3)        if event.isSet():            print("红灯亮起,所有行驶中的车辆不允许通过")            event.clear()        else:            print("绿灯亮起,所有行驶中的车辆必须通过")            event.set()
if __name__ == '__main__':
    # 设置公路线程组    highwayThreads = []
    # 创建汽车新线程    bmwCar = threading.Thread(target = drive, args = ("BMWCar", ))    vwCar = threading.Thread(target = drive, args = ("VWCar", ))
    # 将汽车线程添加到公路线程组    highwayThreads.append(bmwCar)    highwayThreads.append(vwCar)
    # 汽车启动    for thread in highwayThreads:        thread.start()
    # 红绿灯发送事件通知    sign()

运行结果:


绿灯初始化BMWCar正在行驶中,行驶了60KmVWCar正在行驶中,行驶了60KmBMWCar通过了红灯BMWCar正在行驶中,行驶了120KmVWCar通过了红灯VWCar正在行驶中,行驶了120KmBMWCar通过了红灯BMWCar正在行驶中,行驶了180KmVWCar通过了红灯VWCar正在行驶中,行驶了180Km红灯亮起,所有行驶中的车辆不允许通过绿灯亮起,所有行驶中的车辆必须通过VWCar通过了红灯VWCar正在行驶中,行驶了240KmBMWCar通过了红灯BMWCar正在行驶中,行驶了240KmVWCar通过了红灯VWCar正在行驶中,行驶了300KmBMWCar通过了红灯BMWCar正在行驶中,行驶了300KmVWCar通过了红灯VWCar正在行驶中,行驶了360KmBMWCar通过了红灯BMWCar正在行驶中,行驶了360Km红灯亮起,所有行驶中的车辆不允许通过绿灯亮起,所有行驶中的车辆必须通过VWCar通过了红灯VWCar正在行驶中,行驶了420KmBMWCar通过了红灯


实例2


面试题:有两个线程 A、B,A 线程打印 a,b,c 的字母,B线程打印 2,4,6 的数字,A、B 线程将轮询打印,如:a2 b4 c6...


import threadingfrom threading import Event
# 打印字母函数def printLetter(letterEvent, numEvent):    for item in ["a", "b", "c"]:        letterEvent.wait()        print(item, end="")        letterEvent.clear()        numEvent.set()
# 打印数字函数def printNum(numEvent, letterEvent):    for item in [2, 4, 6]:        numEvent.wait()        print(item, end=" ")        numEvent.clear()        letterEvent.set()
if __name__ == '__main__':    letterEvent, numEvent = Event(), Event()    t1 = threading.Thread(target = printLetter, args = (letterEvent, numEvent))    t2 = threading.Thread(target = printNum, args = (numEvent, letterEvent))
    threads = []    threads.append(t1)    threads.append(t2)
    for t in threads:        t.start()
    letterEvent.set()


运行结果:


a2 b4 c6

示例代码:https://github.com/JustDoPython/python-100-day/tree/master/day-054

目录
相关文章
|
3天前
|
Python
|
6天前
|
安全 调度 Python
探索Python中的并发编程:协程与多线程的比较
本文将深入探讨Python中的并发编程技术,重点比较协程与多线程的特点和应用场景。通过对协程和多线程的原理解析,以及在实际项目中的应用案例分析,读者将能够更好地理解两种并发编程模型的异同,并在实践中选择合适的方案来提升Python程序的性能和效率。
|
4天前
|
Java 测试技术 Python
Python的多线程允许在同一进程中并发执行任务
【5月更文挑战第17天】Python的多线程允许在同一进程中并发执行任务。示例1展示了创建5个线程打印"Hello World",每个线程调用同一函数并使用`join()`等待所有线程完成。示例2使用`ThreadPoolExecutor`下载网页,创建线程池处理多个URL,打印出每个网页的大小。Python多线程还可用于线程间通信和同步,如使用Queue和Lock。
17 1
|
4天前
|
数据处理 Python
Python并发编程:实现高效的多线程与多进程
Python作为一种高级编程语言,提供了强大的并发编程能力,通过多线程和多进程技术,可以实现程序的并发执行,提升系统的性能和响应速度。本文将介绍Python中多线程和多进程的基本概念,以及如何利用它们实现高效的并发编程,解决实际开发中的并发性问题。
|
6天前
|
Java Python
Python 内置库 多线程threading使用讲解
本文介绍Python中的线程基础。首先展示了单线程的基本使用,然后通过`threading`模块创建并运行多线程。示例中创建了两个线程执行不同任务,并使用`active_count()`和`enumerate()`检查线程状态。接着讨论了守护线程,主线程默认等待所有子线程完成,但可设置子线程为守护线程使其随主线程一同结束。`join()`方法用于主线程阻塞等待子线程执行完毕,而线程池能有效管理线程,减少频繁创建的开销,Python提供`ThreadPoolExecutor`进行线程池操作。最后提到了GIL(全局解释器锁),它是CPython的机制,限制了多线程并行执行的能力,可能导致性能下降。
13 1
|
6天前
|
消息中间件 程序员 调度
Python并发编程:利用多线程提升程序性能
本文探讨了Python中的并发编程技术,重点介绍了如何利用多线程提升程序性能。通过分析多线程的原理和实现方式,以及线程间的通信和同步方法,读者可以了解如何在Python中编写高效的并发程序,提升程序的执行效率和响应速度。
|
6天前
|
并行计算 安全 测试技术
Python多线程
【4月更文挑战第13天】对比多线程与多进程:多线程适合I/O密集型任务,轻量级但受GIL限制;多进程适用于CPU密集型任务,能实现真正并行。多线程直接共享内存,多进程独立内存,各有优劣。
21 0
|
6天前
|
数据采集 安全 Java
Python的多线程,守护线程,线程安全
Python的多线程,守护线程,线程安全
|
6天前
|
并行计算 数据处理 开发者
Python并发编程:解析异步IO与多线程
本文探讨了Python中的并发编程技术,着重比较了异步IO和多线程两种常见的并发模型。通过详细分析它们的特点、优劣势以及适用场景,帮助读者更好地理解并选择适合自己项目需求的并发编程方式。
|
6天前
|
调度 Python 容器
【python】-详解进程与线程
【python】-详解进程与线程