信号量和事件及队列补充

【一】信号量(了解)

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

【1】引入

  • 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据

【2】例子

  • 比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去

  • Lock 锁住一个马桶,同时只能有一个人

  • Semaphore 锁住的是公共厕所,同时可以来一堆人

【3】示例

  • 如果指定信号量为3,那么来一个人获得一把锁,计数加1,当计数等于3时,后面的人均需要等待。

  • 一旦释放,就有人可以获得一把锁

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

from multiprocessing import Process, Semaphore
import time
import random
​
​
def go_wc(sem, user):# 【1】对信号量加锁,一个进程占用则锁池 -1sem.acquire()
​print(f'{user} 占到一个坑\n')# 模拟每一个人如厕的速度不一样,0代表没拉出来,直接出来了time.sleep(random.randint(0, 3))# 【2】释放信号量锁sem.release()print(f'{user} 站起来了\n')
​
​
if __name__ == '__main__':# 【一】创建一个信号量的池子sem = Semaphore(5)p_1 = []# 【二】十三个子进程for i in range(13):# 【三】创建子进程p = Process(target=go_wc, args=(sem, f"user {i}:",))# 【四】启动子进程p.start()# 【五】添加到进程列表p_1.append(p)# 等待所有子进程执行完毕for i in p_1:i.join()print('=======')user 0: 占到一个坑
​
user 2: 占到一个坑
​
user 1: 占到一个坑
​
user 1: 站起来了
​
user 4: 占到一个坑
​
user 3: 占到一个坑
​
user 6: 占到一个坑
​
user 2: 站起来了
​
user 5: 占到一个坑
​
user 0: 站起来了
​
user 8: 占到一个坑
​
user 4: 站起来了
​
user 7: 占到一个坑
​
user 6: 站起来了
​
user 10: 占到一个坑
user 9: 占到一个坑
​
user 3: 站起来了
​
​
user 10: 站起来了
​
user 11: 占到一个坑
​
user 8: 站起来了
​
user 12: 占到一个坑
​
user 12: 站起来了
​
user 5: 站起来了
​
user 7: 站起来了
​
user 11: 站起来了
​
user 9: 站起来了
​
=======

【二】事件

【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, Manager
import time
import random
​
# 能给你的python解释器终端显示的内容上色
color_red = '\033[31m'
color_reset = '\033[0m'
color_green = '\033[32m'
​
​
# 定义车辆行为函数,它会根据事件对象(event)的状态来决定是否等待或通过路口
def car(event, n):'''模拟汽车行为:param event: 事件对象,用于同步操作,红绿灯状态的标识:param n: 第几辆车的标识:return: 无返回值'''
​# 创建一个无限循环直到车辆离开while True:# 如果事件未设置,表示红灯 Falseif not event.is_set():# 红灯亮时,车辆等待,并输出提示信息print(f'{color_red}红灯亮{color_reset},car{n} :>>> 正在等待 ... ')# 阻塞当前进程,等待event被设置(绿灯)event.wait()# 当event被设置后,打印绿灯信息print(f'{color_green}车 {n} :>>>> 看见绿灯亮了{color_reset}')# 模拟通过路口需要的时间time.sleep(random.randint(3, 6))# 防止在sleep期间event状态改变,再次检查状态if not event.is_set():continue# 通过路口print(f'car {n} :>>>> 安全通行')# 退出循环break
​
​
# 定义 警车 行为函数, 警车 在红灯时等待一秒后直接通过
def police_car(event, n):'''模拟 警车 行为:param event: 事件对象,用于同步操作,红绿灯状态的标识:param n: 第几辆车的标识:return: 无返回值'''while True:# 判断是否为红灯if not event.is_set():print(f'{color_red}红灯亮{color_reset},car{n} :>>> 正在等待 ... ')#  等待1秒,不完全遵守交通规则event.wait(1)print(f'灯的是{event.is_set()},警车走了,car{n}')# 通过后立即结束循环break
​
​
# 定义交通灯控制函数,周期性切换红绿灯状态
def traffic_lights(event, interval):'''模拟 交通灯 行为:param event: 事件对象,用于同步操作,红绿灯状态的标识:param interval: 间隔(比如10秒)改变信号灯:return: 无返回值'''# 无限循环,持续控制交通灯状态while True:# 按照给定间隔(比如10秒)改变信号灯time.sleep(interval)# 如果当前是绿灯if event.is_set():# 切换到红灯状态# event.is_set() ---->Falseevent.clear()else:# 如果当前是红灯,则切换到绿灯状态# event.is_set() ----> Trueevent.set()
​
​
def main():# 初始化事件对象,初始状态为清除(即红灯)event = Event()# 使用Manager创建一个可跨进程共享的Event对象# manager = Manager()# event = manager.Event()
​# 创建并启动多个 警车 进程# for i in range(5):#     police_car_process = Process(target=police_car, args=(event, i))#     police_car_process.start()for i in range(5):police_car_process = Process(target=car, args=(event, i))police_car_process.start()# 启动交通灯控制进程# 交通灯变化周期为10秒traffic_lights_process = Process(target=traffic_lights, args=(event, 10))traffic_lights_process.start()
​# 打印分割线,表明程序运行开始print(' ------------交通开始------------- ')
​
​
if __name__ == '__main__':main()#  ------------交通开始-------------# 红灯亮,car2 :>>> 正在等待 ...# 红灯亮,car0 :>>> 正在等待 ...# 红灯亮,car3 :>>> 正在等待 ...# 红灯亮,car1 :>>> 正在等待 ...# 红灯亮,car4 :>>> 正在等待 ...# 灯的是False,警车走了,car2# 灯的是False,警车走了,car0# 灯的是False,警车走了,car3# 灯的是False,警车走了,car1# 灯的是False,警车走了,car4
​# print("\033[31m这是红色文本\033[0m")  # 红色前景色# print("\033[32m这是绿色文本\033[0m")  # 绿色前景色# print("\033[1;33m这是加粗的黄色文本\033[0m")  # 加粗并设置黄色前景色# print("\033[44m这是蓝色背景文本\033[0m")  # 蓝色背景色# print("\033[34;47m这是蓝色前景色和白色背景色的文本\033[0m")  # 蓝色前景和白色背景

【三】队列补充

from queue import Queue, LifoQueue, PriorityQueue
​
# 【一】正常队列
# maxsize 过不给默认值,这个队列的容量就是无限大
# queue = Queue(5)
​
# 放
# queue.put(timeout=1)
# queue.put_nowait()
# 取
# queue.get(timeout=1)
# queue.get_nowait()
​
# 判断队列是否为空
# print(queue.empty())
# 判断是满的
# print(queue.full())
​
# 获取当前队列中的个数
# print(queue.qsize())
​
# 【一】Queue 先进先出
print(f'----------Queue-------------')
queue_normal = Queue(3)
queue_normal.put(1)
queue_normal.put(2)
queue_normal.put(3)
​
print(queue_normal.get())
print(queue_normal.get())
print(queue_normal.get())
# 【二】LifoQueue 后进先出
print(f'----------LifoQueue-------------')
queue_lifo = LifoQueue(3)
​
queue_lifo.put(1)
queue_lifo.put(2)
queue_lifo.put(3)
​
print(queue_lifo.get())
print(queue_lifo.get())
print(queue_lifo.get())
​
# 【三】PriorityQueue : 根据优先级数字越小的先出
print(f'----------PriorityQueue-------------')
queue_priority = PriorityQueue(3)
# 可以给放进队列的元素设置优先级:数字越小优先级越高!
queue_priority.put((50, 111))
queue_priority.put((0, 222))
queue_priority.put((100, 333))
​
print(queue_priority.get())
print(queue_priority.get())
print(queue_priority.get())
​
# (0, 222)
# (50, 111)
# (100, 333)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

死锁和递归锁

【一】死锁 【1】介绍 死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的现象 即两个或多个进程持有各自的锁并视图获取对方持有的锁,从而导致阻塞,不能继续执行,一直僵在这 这种情况下&#xff0…

LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139242199 贪心算法,是在每一步选择中,都采取当前状态下,最好或最优(即最有利)的选择&…

Linux相关知识

一.Linux是什么? 1.Linux是一款开源免费的操作系统 目前市面上较知名的发行版有:Ubuntu,ReaHat,Centos,Debain… ​ 2.Linux的优势? ​ ①性能强劲,安全稳定 ​ ②可定制 ​ ③硬件配置要求低 ​ ④嵌入移动设备 二.Linux安装 三.文件和目录结构 /bin 常用命令 /sbin root…

奇门遁甲古籍《烟奇要览》

《烟奇要览》 全书共178页 时间有限,仅上传部分图片!

YOLOv10介绍与推理--图片和视频演示(附源码)

导 读 本文主要对YOLOv10做简单介绍并给出推理图片和视频的步骤演示。 YOLOv10简介 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑…

人工智能超万卡集群的核心设计原则和架构

超万卡集群的核心设计原则和架构 超万卡集群建设方兴未艾,当前主要依托英伟达GPU及其设备。英伟达GPU在大模型训练中表现卓越,但国产AI芯片虽进步显著,性能与生态构建仍存差距。面对诸多挑战,构建技术领先、基于国产生态的超万卡集群,仍需不断突破与创新。 大模型升级至万…

Linux终端连接工具

终端连接工具有很多中,这里我只收集了一些常用的或免费的工具 我一般会配套使用: FinalShell -->命令行工具(Mac和win) WinSCP -->文件上传工具(win) filezilla -->文件上传工具(Mac …

TensorBoard相关学习

TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具,它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard,你可以可视化模型的结构、监控训练过程中的指标变化(如损失函数、准确率)、查…

金锋关晓柔短视频:成都鼎茂宏升文化传媒公司

金锋关晓柔短视频:情感与创意的交织 在短视频的浪潮中,无数创作者凭借独特的视角和创意脱颖而出。其中,金锋和关晓柔共同打造的短视频系列以其深厚的情感内涵和精湛的创意表达,成都鼎茂宏升文化传媒公司吸引了大量观众的关注&…

Unity Hub 添加模块报错 Validation Failed 的解决办法

提供两种方法,请自行选择其中一种。 在C:\Windows\System32\drivers\etc\hosts中添加下面的内容并保存后,完全关闭Unity Hub并重新打开,再次尝试下载刚刚失败的模块。 127.0.0.1 public-cdn.cloud.unity3d.com 127.0.0.1 public-cdn.cloud.…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中,并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

vue数据持久化仓库

本文章是一篇记录实用性vue数据持久化仓的使用! 首先在src中创建store文件夹,并创建一个根据本页面相关的名称, 在终端导入:npm i pinia 和 npm i pinia-plugin-persistedstate 接下来引入代码: import { defineSt…

大众点评全国店铺基础信息采集2024年5月美食、丽人、休闲娱乐、酒店、结婚、爱车、宠物、亲子、医疗、运动等上千万家

大众点评全国店铺基础信息采集2024年5月美食、丽人、休闲娱乐、酒店、结婚、爱车、宠物、亲子、医疗、运动等上千万家 点位示例: 店铺id l4QWAe0vWddska61 店铺名称 太平洋影城(春熙店) 十分制服务评分 8.3 十分制环境评分 8.3 十分制划算评分 8.1 人均价格 …

Python Anaconda环境复制

虚拟环境复制 conda-pack 第一种方式 conda打包 在打包之前如果没有conda-pack包的话,需要安装pip install conda-pack打包 conda pack -n py36 -o py366.tar.gz -o就是给导出得到的压缩包就在当前目录下 传输到另外一台服务器上 有两台linux服务器&#xff0c…

有哪些永久免费的进销存管理软件?

我明白许多中小企业在寻求进销存系统时,希望能找到一款完全免费的解决方案,以减轻经济压力。这种心态非常正常,毕竟成本是任何企业都需要仔细考虑的因素。然而,我要强调的是,市场上那些声称“完全免费”的进销存系统&a…

东子哥:从来不拼搏的人,不是我的兄弟!新一轮裁员潮即将来临!

今年初,包括微软、亚马逊、谷歌母公司Alphabet等在内的巨头先后宣布裁员计划,曾掀起了一轮裁员潮。 进入年中阶段,特斯拉、理想汽车、TikTok、安德玛等知名巨头,也先后宣布裁员计划,难道,新一轮裁员潮已经…

OrangePi AIpro评测 - 基础操作篇

0. 环境 ●OrangePi AIpro ●win10笔记本 ●路由器 准备下win10电脑、路由器,这些板卡通常是在网络正常的环境下才方便测试。 还要准备OrangePi AIpro的官方资料: http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-suppo…

第八届能源、环境与材料科学国际学术会议(EEMS 2024)

文章目录 一、重要信息二、大会简介三、委员会四、征稿主题五、论文出版六、会议议程七、出版信息八、征稿编辑 一、重要信息 会议官网:http://ic-eems.com主办方:常州大学大会时间:2024年06月7-9日大会地点:新加坡 Holiday Inn …

[NISACTF 2022]easyssrf、[NISACTF 2022]level-up

[NISACTF 2022]easyssrf 使用dirsearch扫描后没发现什么路径 尝试访问127.0.0.1,成功了 访问127.0.0.1/flag.php提示有文件/fl4g 使用file://协议读取文件/fl4g,提示除此页面外还有一个ha1x1ux1u.php页面。 file:///fl4g 直接访问,发现GET…

网络故障排除-OSPF故障

一、OSPF邻居建立不成功 1、检查邻居两端的接口物理和协议状态是否UP,状态是否稳定,接口是否有丢包,两边互ping大包是否能通。 2、检查链路两端OSPF进程的Router ID是否一致。 3、检查链路两端OSPF区域ID是否一致。 4、检查链接两端OSPF接…