信号量和事件

(一)信号量

  • 信号量Semahpore(同线程一样)

(1)引入

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

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

"""信号量"""
# 信号量 可以允许同一时刻多个线程修改数据
# 导入模块
from  multiprocessing import Process , Semaphore
import time

def run_task(sem,i):
    # 对信号量加锁
    sem.acquire()
    print(f"子进程{i}")
    # 设置io阻塞
    time.sleep(2)
    # 信号量解锁
    sem.release()
def main_process():
    # 创建信号量池
    sem = Semaphore(3)
    # 创建进程对象
    task_list=[Process(target=run_task,args=(sem,i)) for i in  range(1,11)]
    # 开启进程
    [task.start() for task in task_list]
    # 等待子进程结束
    [task.join() for task in task_list]

if __name__ == '__main__':
    main_process()

# 子进程1
# 子进程3
# 子进程2
# 子进程5
# 子进程4
# 子进程6
# 子进程7
# 子进程8
# 子进程9
# 子进程10

# 允许同一时刻多个线程修改数据

(二)事件

(1)什么是事件

  • Event(同线程一样)

(2)事件处理方法

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

def car(e,n):
    while True:
        if not e.is_set(): #Flase
            print('\033[31m红灯亮\033[0m,car%s等着' %n)
            e.wait()
            print('\033[32m车%s 看见绿灯亮了\033[0m' %n)
            time.sleep(random.randint(3,6))
            if not e.is_set():
                continue
            print('走你,car', n)
            break

def police_car(e,n):
    while True:
        if not e.is_set():
            print('\033[31m红灯亮\033[0m,car%s等着' % n)
            e.wait(1)
            print('灯的是%s,警车走了,car %s' %(e.is_set(),n))
            break

def traffic_lights(e,inverval):
    while True:
        time.sleep(inverval)
        if e.is_set():
            e.clear() #e.is_set() ---->False
        else:
            e.set()

if __name__ == '__main__':
    e=Event()
    # for i in range(10):
    #     p=Process(target=car,args=(e,i,))
    #     p.start()

    for i in range(5):
        p = Process(target=police_car, args=(e, i,))
        p.start()
    t=Process(target=traffic_lights,args=(e,10))
    t.start()

    print('============》')
posted @   苏苏!!  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示