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

【9.0】信号量和事件

时间:2024-01-23 14:34:23浏览次数:42  
标签:__ set 9.0 信号量 事件 print 茅坑 user

【一】信号量(了解)

  • 信号量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('============》')

标签:__,set,9.0,信号量,事件,print,茅坑,user
From: https://www.cnblogs.com/dream-ze/p/17982399

相关文章

  • 基于信号量的环形队列的生成消费模型(万字长文详解)
    linux线程之信号量POSIX信号量阻塞队列的缺陷==这是一个我们自己的实现阻塞队列!==classBlockQueue{public:BlockQueue(constint&maxcap=gmaxcap):maxcap_(maxcap){pthread_mutex_init(&mutex_,nullptr);......
  • MySQL事件自动kill运行时间超时的SQL
    delimiter$createeventmy_long_running_trx_monitoronscheduleevery1minutestarts'2015-09-1511:00:00'oncompletionpreserveenabledobegindeclarev_sqlvarchar(500);declareno_more_long_running_trxintegerdefault0;declarec_......
  • 线程同步之信号量
    目录Semaphore信号量Semaphore与condition_variable的区别Semaphore信号量在C++中,可以使用std::Semaphore类来实现信号量。信号量可以用于控制对资源的访问,例如限制同时执行任务的线程数量。在C++11中,std::Semaphore类提供了以下常用函数:Semaphore():构造函数,创建一个信......
  • 别再混淆事件源(Event Sourcing)和消息流(Message Streaming)了!
    0前言Kafka不适合事件溯源,Kafka适合消息流。这两种事物需要不同存储机制。事件溯源(EventSourcing),需DB充当事件日志,为事件溯源存储的事件必须以某种方式编写,以便将来的读取能够快速组装属于单个聚合的较小(更小的)事件流最初发射它们的。这需要随机访问索引消息流(MessageS......
  • 细说JavaScript事件处理(JavaScript事件处理详解)
    js语言的一个特色和就是它的动态性,即一时间驱动的方式对用户输入作出反应而不需要依赖服务器端程序。事件是指人机交互的结果,如鼠标移动、点击按钮、在表单中输入数据或载入新的Web洁面等。一、什么是事件事件是一些可以通过脚本响应的页面动作,当文档、浏览器、元素发生某些有趣......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>......
  • 细说JavaScript事件处理(JavaScript事件处理详解)
    js语言的一个特色和就是它的动态性,即一时间驱动的方式对用户输入作出反应而不需要依赖服务器端程序。事件是指人机交互的结果,如鼠标移动、点击按钮、在表单中输入数据或载入新的Web洁面等。一、什么是事件事件是一些可以通过脚本响应的页面动作,当文档、浏览器、元素发生某些有......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>输......
  • Vue_中央事件总线EventBus传值&自定义MyEventBus
    一、EventBus的创建以及使用//1、在src的main.js中,加上以下代码importVuefrom'vue'Vue.prototype.$EventBus=newVue()//2、发送消息,使用Vue原型链引入this.$EventBus.$emit('getSumu',"sumu10086")//3、监听接收消息,使用Vue原型链引入this.$EventBus.$......
  • 2024-1-19事件冒泡
    目录事件冒泡什么是事件冒泡冒泡事件例子事件冒泡什么是事件冒泡事件冒泡是一个事件处理机制,在这个机制中,当一个元素上发生事件(比如点击),这个事件不仅在该元素上触发,还会向上通过父元素传播,依次触发每个父元素上的同类型事件,直到到达文档的根部。这个过程就像气泡从水底升到水面......