python-- 信号量 Semphore、事件 Event

简介: python-- 信号量 Semphore、事件 Event

信号量 Semphore


sem=Semphore(n):n是指初始化一把锁配几把钥匙,一个int型

拿钥匙,锁门 sem.acquire()

还钥匙,开门 sem.release()

信号量机制比锁机制多了一个计数器,这个计数器是用来计录当前剩几把钥匙的。当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。

对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1

from multiprocessing import Process, Semaphore
l = Semaphore(3)  # 实例化,传一个int型的值
l.acquire()  # 拿走1把钥匙,锁上门
print(12)
l.acquire()  # 拿走1把钥匙,锁上门
print(34)
l.acquire()  # 拿走1把钥匙,锁上门
print(56)
l.acquire()  # 拿走1把钥匙,锁上门
print(78)

结果:

12
34
56
# 只有三把钥匙,当遇到第四个l.acquire()时就阻塞了

释放锁

from multiprocessing import Process, Semaphore
l = Semaphore(3)  # 实例化,传一个int型的值
l.acquire()  # 拿走1把钥匙,锁上门
print(12)
l.acquire()  # 拿走1把钥匙,锁上门
print(34)
l.acquire()  # 拿走1把钥匙,锁上门
print(56)
l.release()  # 释放钥匙
l.acquire()  # 拿走1把钥匙,锁上门
print(78)

结果

12
34
56
78

案例

from multiprocessing import Process, Semaphore
import time
import random
def func(i, sem):
    sem.acquire()
    print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)
    time.sleep(2)
    print('第%s个人出去小黑屋,还了钥匙打开门' % i)
    sem.release()
if __name__ == '__main__':
    sem = Semaphore(5)  # 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋
    # 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入
    for i in range(20):
        p = Process(target=func, args=(i, sem,))
        p.start()

结果:

第0个人进入小黑屋,拿了钥匙锁上门
第1个人进入小黑屋,拿了钥匙锁上门
第2个人进入小黑屋,拿了钥匙锁上门
第3个人进入小黑屋,拿了钥匙锁上门
第4个人进入小黑屋,拿了钥匙锁上门
第0个人出去小黑屋,还了钥匙打开门
第1个人出去小黑屋,还了钥匙打开门
第5个人进入小黑屋,拿了钥匙锁上门
第6个人进入小黑屋,拿了钥匙锁上门
第2个人出去小黑屋,还了钥匙打开门第3个人出去小黑屋,还了钥匙打开门
第7个人进入小黑屋,拿了钥匙锁上门
第8个人进入小黑屋,拿了钥匙锁上门
第4个人出去小黑屋,还了钥匙打开门
第9个人进入小黑屋,拿了钥匙锁上门
第5个人出去小黑屋,还了钥匙打开门
第6个人出去小黑屋,还了钥匙打开门
第10个人进入小黑屋,拿了钥匙锁上门
第11个人进入小黑屋,拿了钥匙锁上门
第7个人出去小黑屋,还了钥匙打开门
第8个人出去小黑屋,还了钥匙打开门
第9个人出去小黑屋,还了钥匙打开门
第12个人进入小黑屋,拿了钥匙锁上门
第13个人进入小黑屋,拿了钥匙锁上门
第14个人进入小黑屋,拿了钥匙锁上门
第10个人出去小黑屋,还了钥匙打开门第11个人出去小黑屋,还了钥匙打开门
第14个人出去小黑屋,还了钥匙打开门第12个人出去小黑屋,还了钥匙打开门
第13个人出去小黑屋,还了钥匙打开门
第17个人进入小黑屋,拿了钥匙锁上门
第18个人进入小黑屋,拿了钥匙锁上门第15个人进入小黑屋,拿了钥匙锁上门
第19个人进入小黑屋,拿了钥匙锁上门第16个人进入小黑屋,拿了钥匙锁上门
第18个人出去小黑屋,还了钥匙打开门第15个人出去小黑屋,还了钥匙打开门第17个人出去小黑屋,还了钥匙打开门
第19个人出去小黑屋,还了钥匙打开门
第16个人出去小黑屋,还了钥匙打开门


事件 Event


e = Event()
e.set()
e.clear()
e.wait()
e.is_set()
# 事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态
# 当is_set()的bool值为False时,e.wait()是阻塞状态
# 当is_set()的bool值为True时,e.wait()是非阻塞状态
# 当使用set()时,是把is_set的bool变为True
# 当使用clear()时,是把is_set的bool变为False

红绿灯案例

from multiprocessing import Process, Event
import time
def lighter(l):
    count = 0
    l.set()  # 先设置绿灯
    while True:
        if count > 5 and count < 10:
            l.clear()  # 把标志位清了,改为红 灯
            print('\033[41;1m  red light  ...\033[0m')
        elif count > 10:
            l.set()  # 变绿灯
            count = 0
        else:
            print('\033[42;1m green light...\033[0m')
        time.sleep(1)
        count += 1
def car(name, l):
    while True:
        if l.is_set():  # 判断标志位是否存在
            print('[%s] runing' % name)
            time.sleep(1)
        else:
            print('[%s] sees red light,waiting...' % name)
            l.wait()  # 等待标志位设定
            print('\033[34;1m[%s] green light is on,start going...\033[0m' % name)
if __name__ == '__main__':
    l = Event()
    light = Process(target=lighter, args=(l,))
    light.start()
    car1 = Process(target=car, args=('BMW', l))
    car1.start()


相关文章
|
9月前
|
移动开发 JavaScript 前端开发
精通服务器推送事件(SSE)与 Python 和 Go 实现实时数据流 🚀
服务器推送事件(SSE)是HTML5规范的一部分,允许服务器通过HTTP向客户端实时推送更新。相比WebSocket,SSE更轻量、简单,适合单向通信场景,如实时股票更新或聊天消息。它基于HTTP协议,使用`EventSource` API实现客户端监听,支持自动重连和事件追踪。虽然存在单向通信与连接数限制,但其高效性使其成为许多轻量级实时应用的理想选择。文中提供了Python和Go语言的服务器实现示例,以及HTML/JavaScript的客户端代码,帮助开发者快速集成SSE功能,提升用户体验。
|
11月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
361 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
JavaScript 前端开发 关系型数据库
事件管理工具:用Python和Vue打造在线预订和票务系统
【4月更文挑战第11天】构建一个在线预订和票务系统,结合Python(Flask或Django)后端与Vue.js前端。准备工作包括设置Python环境、Node.js、数据库和Git。后端创建RESTful API,Flask适合轻量级,Django提供完整框架。前端使用Vue CLI、Vuex和Vue Router构建用户界面。通过Vuex管理状态,Vue Router定义路由,Axios与后端通信。这种架构支持团队协作,代码维护和扩展。
238 0
|
机器学习/深度学习 数据采集 传感器
使用Python实现深度学习模型:智能极端天气事件预测
使用Python实现深度学习模型:智能极端天气事件预测
1008 3
|
Python
源码解密 Python 的 Event
源码解密 Python 的 Event
187 1
|
存储 Python
离散事件模拟(Discrete Event Simulation)详解与Python代码示例
离散事件模拟(Discrete Event Simulation)详解与Python代码示例
|
机器学习/深度学习 数据采集 监控
Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别
Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
JSON 数据格式 Python
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
102 0
|
安全 API Python
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。

推荐镜像

更多