第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

目录
相关文章
|
21天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
4天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
16天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
37 4
|
23天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
29天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
1月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
29 3
|
1月前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
65 3
|
1月前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
56 0
|
1月前
|
安全 Java 数据库连接
Python多线程编程:竞争问题的解析与应对策略
Python多线程编程:竞争问题的解析与应对策略
21 0
|
1月前
|
设计模式 监控 安全
Python多线程编程:特性、挑战与最佳实践
Python多线程编程:特性、挑战与最佳实践
35 0