【9.0】信号量和事件

【一】信号量(了解)

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

【1】引入

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

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

from multiprocessing import Process, Semaphore
import time
import random


def go_wc(sem, user):
    # 【1】对信号量加锁,一个进程占用则锁池 -1
    sem.acquire()

    print(f' {user} 占到一个茅坑')
    # 模拟每个人拉屎速度不一样,0代表有的人蹲下就起来了
    time.sleep(random.randint(0, 3))

    # 【2】释放信号量锁
    sem.release()


if __name__ == '__main__':
    # 【一】创建一个信号量的池子
    sem = Semaphore(5)
    # 用来存储所有的子进程
    p_l = []
    # 【二】十三个子进程
    for i in range(13):
        # 【三】创建子进程
        p = Process(target=go_wc, args=(sem, f'user {i}:>>>> ',))
        # 【四】启动子进程
        p.start()
        # 【五】添加到进程列表
        p_l.append(p)
    # 等待所有子进程执行完毕
    for i in p_l:
        i.join()
    print('============》')
    
    #  user 9:>>>>  占到一个茅坑
    #  user 8:>>>>  占到一个茅坑
    #  user 10:>>>>  占到一个茅坑
    #  user 0:>>>>  占到一个茅坑
    #  user 7:>>>>  占到一个茅坑
    #  user 6:>>>>  占到一个茅坑
    #  user 2:>>>>  占到一个茅坑
    #  user 11:>>>>  占到一个茅坑
    #  user 4:>>>>  占到一个茅坑
    #  user 1:>>>>  占到一个茅坑
    #  user 5:>>>>  占到一个茅坑
    #  user 3:>>>>  占到一个茅坑
    #  user 12:>>>>  占到一个茅坑
    # ============》

【二】事件(了解)

【1】什么是事件

  • Event(同线程一样)

【2】事件处理方法

  • python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法 set、wait、clear。

  • 事件处理的机制:

    • 全局定义了一个“Flag”
    • 如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞
    • 如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
    • clear:
      • 将“Flag”设置为False
    • set:
      • 将“Flag”设置为True
#_*_coding:utf-8_*_
#!/usr/bin/env python

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 @ 2024-01-23 14:28  Chimengmeng  阅读(9)  评论(0编辑  收藏  举报
/* */