首页 > 其他分享 >信号量和事件

信号量和事件

时间:2024-04-09 20:46:34浏览次数:25  
标签:__ 灯亮了 用户 信号量 事件 信号 event

信号量和事件

一、信号量

  • 信号量Semahpore(同线程一样)
  • 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据
  • 比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去
  • 如果指定信号量为3,那么来一个人获得一把锁,计数加1,当计数等于3时,后面的人均需要等待。
  • 一旦释放,就有人可以获得一把锁

信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念

from multiprocessing import Process, Semaphore
import time
import random


def run(sem, i):
    sem.acquire()
    print(f'用户{i}占了一个信号位!')
    time.sleep(random.randint(0, 3))
    sem.release()
    print(f'用户{i}释放了一个信号位!')


def main():
    sem = Semaphore(2)

    p_list = []

    for i in range(6):
        p = Process(target=run, args=(sem, i))
        p.start()
        p_list.append(p)

    for p in p_list:
        p.join()


if __name__ == '__main__':
    main()


# 在没有进程结束并释放的时候只允许最多2个进程同时运行
"""
用户0占了一个信号位!
用户2占了一个信号位!
用户2释放了一个信号位!
用户1占了一个信号位!
用户0释放了一个信号位!
用户3占了一个信号位!
用户3释放了一个信号位!
用户4占了一个信号位!
用户4释放了一个信号位!
用户1释放了一个信号位!
用户5占了一个信号位!
用户5释放了一个信号位!
"""

二、事件

[1]关于事件

  • Event(同线程一样)

[2]事件的处理方法

  • python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法 set、wait、clear。
  • 事件处理的机制:
    • 全局定义了一个“Flag”
    • 如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞
    • 如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
    • clear:
      • 将“Flag”设置为False
    • set:
      • 将“Flag”设置为True
from multiprocessing import Process, Event
import time
import random


def car(event, n):
    # 车辆到达红绿灯的时间是随机的
    time.sleep(random.randint(1, 10))
    # 如果到达的时候是红灯
    if not event.is_set():
        # 红灯的时候就等着
        print(f'\033[31m红灯亮了\033[0m,车{n}等着')
        # 等到变成绿的就走了
        event.wait()
        print(f'\033[32m绿灯亮了\033[0m,车{n}走了')
    # 如果来的时候就是绿灯就直接走
    else:
        print(f'\033[32m绿灯亮了\033[0m,车{n}走了')


def traffic_lights(event, interval):
    # 默认是红灯(False)
    while True:
        # 红绿灯时间都是五秒
        time.sleep(interval)
        # 五秒秒后如果是红灯就变绿灯
        if event.is_set():
            event.clear()
        # 如果是绿灯就变红灯
        else:
            event.set()


if __name__ == '__main__':
    # 设置事件(默认值是False)红灯
    e = Event()
    # 一共十辆车
    for i in range(10):
        p = Process(target=car, args=(e, i,))
        p.start()
    # 设置红绿灯,变化时间为五秒
    t = Process(target=traffic_lights, args=(e, 5))
    t.start()

"""
============》
红灯亮了,车6等着
红灯亮了,车2等着
红灯亮了,车5等着
红灯亮了,车9等着
红灯亮了,车0等着
红灯亮了,车1等着
红灯亮了,车8等着
红灯亮了,车4等着
绿灯亮了,车6走了!
绿灯亮了,车2走了!
绿灯亮了,车5走了!
绿灯亮了,车9走了!
绿灯亮了,车0走了!
绿灯亮了,车8走了!
绿灯亮了,车4走了!
绿灯亮了,车1走了!
红灯亮了,车3等着
绿灯亮了,车3走了!
红灯亮了,车7等着
绿灯亮了,车7走了!
"""

标签:__,灯亮了,用户,信号量,事件,信号,event
From: https://www.cnblogs.com/taoyuanshi/p/18124740

相关文章

  • 2-48. 实现鼠标选中物品后的场景点击事件流程
    修改CursorManager修改EventHandler修改Player修改GridMapManager继续修改CursorManager继续修改EventHandler我们希望人物扔出东西的时候,不是直接在地面上生成一个物品,而是有一个扔的效果修改ItemManager修改InventoryManager继续修改GridMapMa......
  • 《逆商》我们该如何应对坏事件,每个人一生总有一次独自面对致胜困局 - 三余书屋 3ysw.n
    逆商:我们该如何应对坏事件你好,今天我们要聊的书是《逆商》,这本书是心理学领域的一部创新之作,首次问世可追溯到1997年。我们今天聊的是2019年的修订版,从原版到现在的新版,已经过去了20多年。作者对逆商的理论、案例以及应用都进行了更丰富的扩展和升级。这本书可以帮助我们解决......
  • 强删pod是否产生update事件
    k8sv1.19.0强删Pod产生Update事件informerFactory.Core().V1().Pods().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ UpdateFunc:func(old,newinterface{}){ newPod,ok:=new.(*core_v1.Pod) ifok&&newPod.DeletionTimestamp!=nil{ ......
  • 2024年4月8日-UE5-开始菜单、事件分发器、UI预构造
    做个简单的菜单在主页面这里新建一个地图,按CTRL+N 把地面复制过来在开始关卡新建一个摄像机 打开关卡蓝图,先左键选中摄像机,然后在关卡蓝图里点右键,把摄像机拖下来   在UI里新建一个用户控件 再新建一个通用按钮 打开按钮的控件蓝图拖一个按钮进来 然......
  • 敌人——被命中事件和命中反馈
    目标在玩家角色蓝图中添加命中事件在敌人角色蓝图中接收命中事件,并编写反馈逻辑1.在玩家角色蓝图中添加命中事件使用射线检测的方式制作命中事件(判定点在刀光特效的生成点上),同时在玩家命中目标时让玩家时间暂停(顿帧)时间暂停宏(注意:这里不是全局时间膨胀,使用全局时间膨胀可......
  • C#事件简述
    C#事件简述有人说事件就是特殊的多播委托,有人说不是,仁者见仁智者见智,用起来是差不多的。1、首先声明一个委托publicdelegatevoid一个示例委托();这个委托一般就是一个归类作用,基于这个委托我可以创建很多个同类型(返回值相同、参数值类型相同,业务逻辑类似)的事件,例如:......
  • delphi 利用TMethod 调用事件函数过程。
    delphi利用TMethod调用事件函数过程,这里只说TNotifyEvent。可以用TNotifyEvent变量存起来,然后调用。但这样如果有多个的话,就麻烦,要定义很多个变量。可以转成 TMethod,存datacode就可以了。TMethod(SaveB.OnClick).CodeTMethod(SaveB.OnClick).Data两个可以存到stringlis......
  • 事件循环
    事件循环单线程是异步产生的原因事件循环是异步的实现方式浏览器的进程模型何为进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意何为线程?有了进程后,就可以运行程序的代码了......
  • 2-40. 实现人物跨场景移动以及场景加载前后事件
    解决上节课加载场景出现的报错问题下面两个地方需要在场景加载之后进行处理修改EventHandler修改TransitionManager修改SwitchBounds修改TransitionManager让人物在场景加载后才能移动修改EventHandler加载完场景移动人物坐标增加变量控制人物移动注册事......
  • HTML:HTML事件汇总
    html事件是用户和页面交互的一些效果,用户通过点击,触摸等等方式更新数据,页面在加载完成之后的交互效果就需要通过触发事件来完成,事件大概分为,鼠标事件,窗口事件,表单事件,键盘事件,媒体事件等HTML事件窗口事件(window事件)属性 值 描述onafterprint   script在打印文档之后运......