(6)进程---Event事件

本文通过Python的multiprocessing模块中的Event类实现了一个简单的红绿灯系统,并使用多个进程来模拟车辆通过红绿灯的过程。红绿灯状态由Event对象控制,车辆进程通过检查Event对象的状态决定是否等待。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 阻塞事件 :

e = Event()生成事件对象e

e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False]

e.wait(2) 传参,相当于time.sleep(2)

# 如果是True 那就不加阻塞

# 如果是False 就加阻塞

# 控制这个属性的值

# set()方法 将这个属性的值改成True

# clear()方法 将这个属性的值改成False

# is_set()方法 判断当前的属性是否为True (默认上来是False)

 例:模拟红绿灯,假设有20辆小车全部通过后,红绿灯终止;

from multiprocessing import Process, Event
import time, random
def traffic_light(e):
    # traffic_light 只做一件事就是红灯和绿灯的变色效果
    print("红灯亮")
    while True:
        # 默认is_set 获取到的值是False
        if e.is_set():
            # 红灯区间
            time.sleep(1)
            print("红灯亮")
            e.clear()  # False
        else:
            # 绿灯区间
            time.sleep(1)
            print("绿灯亮")
            e.set()  # True


def car(e, i):
    # e.is_set() 为False时成立
    if not e.is_set():
        print("car %s 在等待" % (i))
        e.wait()
    print("car %s 通过了" % i)


if __name__ == "__main__":
    e = Event()
    lst = []
    p = Process(target=traffic_light, args=(e,))
    p.daemon = True
    p.start()

    for i in range(20):
        time.sleep(random.randrange(0, 2))
        p = Process(target=car, args=(e, i))
        p.start()
        lst.append(p)
    for p in lst:
        p.join()

    print("程序彻底跑完~")
View Code

执行结果: 如果想车辆跑完了,红绿灯继续运行,去掉守护进程和末尾的阻塞就可以了

红灯亮
绿灯亮
car 0 通过了
car 1 通过了
红灯亮
car 3 在等待
car 2 在等待
car 4 在等待
car 5 在等待
car 6 在等待
绿灯亮
car 4 通过了
car 3 通过了
car 2 通过了
car 5 通过了
car 6 通过了
car 7 通过了
car 9 通过了
car 8 通过了
car 10 通过了
红灯亮
car 11 在等待
绿灯亮
car 11 通过了
car 13 通过了
car 12 通过了
car 14 通过了
红灯亮
car 15 在等待
绿灯亮
car 15 通过了
car 17 通过了
car 16 通过了
car 18 通过了
红灯亮
car 19 在等待
绿灯亮
car 19 通过了
程序彻底跑完~

Process finished with exit code 0
View Code

 

转载于:https://www.cnblogs.com/lyj910313/p/10787242.html

### Event-Driven 架构在RTOS中的实现方法 #### 背景介绍 事件驱动架构是一种常见的嵌入式系统开发模式,特别适合于需要对外部事件或用户交互做出快速反应的应用场景[^2]。在这种架构下,系统的行为由发生的事件触发,而不是通过固定的循环逻辑控制流程。 #### 实现原理 在一个支持实时操作系统的环境中,事件驱动架构可以通过以下方式实现: 1. **事件队列机制** 使用RTOS提供的消息队列功能创建一个全局事件队列。每当检测到某个外部事件发生时(例如按键按下、传感器数据更新),会向此队列发送一条对应的消息。任务可以挂起等待特定类型的事件到来后再继续执行[^1]。 2. **任务调度与同步** 在RTOS环境下,不同的任务可能负责处理不同类型的任务或者子系统之间的通信协调工作。对于某些依赖具体条件才能启动工作的任务来说,则可以让其进入阻塞态直到收到预期的通知为止;此时如果另一个更高优先级的任务正在运行也不会影响前者恢复正常运转的时间点因为操作系统本身已经考虑到了这种情况下的资源分配策略从而保证了整个应用层面时间上的精确度以及效率最大化。 3. **中断服务例程(ISR)** 当硬件外设产生中断请求后立即跳转至对应的ISR函数里完成初步的数据采集等工作之后再通知相关联的软件组件去进一步分析处理这部分信息内容——这一步骤往往涉及到唤醒处于休眠状态之中的消费者线程或者是直接往共享缓冲区写入新获取得到的结果供后续读取使用等等动作。 以下是基于FreeRTOS的一个简单示例代码展示如何构建这样一个典型的event-driven system: ```c #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" // 定义用于存储事件类型枚举值 typedef enum { EVENT_TYPE_A, EVENT_TYPE_B, } EventType; QueueHandle_t xEventQueue; // 创建一个句柄变量用来保存实际生成出来的对象实例地址指针 void vTaskA(void *pvParameters){ BaseType_t xStatus; while(1){ EventType event; // 尝试从队列接收下一个待处理项目, 如果当前没有任何可用条目则自动切换上下文让其他就绪级别更高的进程先获得CPU使用权. xStatus = xQueueReceive(xEventQueue,&event,portMAX_DELAY); if(pdPASS == xStatus){ switch(event){ case EVENT_TYPE_A: printf("Handling Event A\n"); break; case EVENT_TYPE_B: printf("Handling Event B\n"); break; default : ; // Do nothing for unknown events } }else{ /* Should never reach here */ } } } void ISR_Handler(){ static const uint8_t ucExpectedInterruptValue = 0xA5; uint8_t ucReceivedValue; // Simulate reading some value from hardware register or peripheral device etc.. ucReceivedValue = ReadHardwareRegister(); if (ucExpectedInterruptValue == ucReceivedValue ){ BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Post an event to the queue indicating that something has happened which needs attention later on by one of our registered listeners... xQueueSendFromISR(xEventQueue,( void* )EVENT_TYPE_A,&xHigherPriorityTaskWoken ); // If we set 'xHigherPriorityTaskWoken' flag above then after returning control back out again will cause immediate context switching before continuing execution flow within this same interrupt handler routine itself ! portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } } ``` 上述例子展示了基本的概念和技术细节关于怎样利用FreeRTOS库特性来搭建一套完整的解决方案满足需求规格说明书里面提到的功能要求同时还能保持良好性能表现水平达到工业标准质量等级产品发布上市销售目的. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值