当前位置: 首页 > news >正文

python多线程高级锁知识:Semaphore信号量、Barrier栅栏在线程中的使用、高级event事件

Semaphore信号量

Semaphore信号量可以翻译为信号量,这个信号量代表了最多允许线程访问的数量,可以使用Semaphore(n)设定,n是信号数量,这是一个更高级的锁机制,Semaphore管理一个计数器,每次使用acquire计数器将会减一,表示可以允许线程访问的数量少了一个,使用release计数器加1,表示可允许线程访问的数量多了一个,只有占用信号量的线程数量超过信号量时候才会阻塞,也就是说计数器为0时候,若还有线程访问,则发生阻塞。

发生阻塞后就需要等待其他线程使用release这时候计数器会加1,然后被阻塞的线程就可以访问了。

在应用Semaphore信号量过程中,有时候可能会有bug造成多次release,因此有所谓的BoundedSemaphore,可以保证计数器次数不超过特定值,这时候使用BoundedSemaphore(n)设定,n是信号数量。

import threading
import time# 需求:允许程序同时并发的线程数,如果设为3则代表最大允许线程数量为3
semaphore = threading.BoundedSemaphore(3)def func():if semaphore.acquire():print(f'{threading.current_thread().name} is working...')time.sleep(1)print(f'{threading.current_thread().name} 完成任务...')semaphore.release()if __name__ == '__main__':# 模拟程序同时并发创建大量的子线程for i in range(10):t = threading.Thread(target=func)t.start()

执行结果
在这里插入图片描述

在这里插入图片描述

Barrier栅栏在线程中的使用

Barrier栅栏可以想象成赛马的栅栏,当线程抵达必须等待其他线程,当所有线程抵达时候,才放开栅栏,这些线程才可以往下执行:

import random
import threadingimport time# 定义任务函数
def player():# 模拟延时time.sleep(random.random())print(f'{threading.current_thread().name} 抵达栅栏的时间是为:{time.ctime()}')b.wait()print(f'{threading.current_thread().name} 继续向后执行')if __name__ == '__main__':# 满足栅栏之后才能够往后执行b = threading.Barrier(4)print(f'比赛开始')# 定义一个子线程列表threads = []for i in range(4):thread = (threading.Thread(target=player))thread.start()threads.append(thread)for thread in threads:thread.join()print('比赛结束')

执行结果
在这里插入图片描述

Event事件在线程中的应用说明

event事件是如何完成线程之间的通信的,看案例

import random
import threading
import timedef waiter(event):for i in range(1,4):print(f'{i} 等待标记flag 被设定')event.wait()# 等待线程如果想要继续向下执行,需要修改flag标记,只有设定线程修改了,等待线程才会往下print(f'等待完成的时间:{time.ctime()}')event.clear()def setter(event):for i in range(1, 4):# 模拟CPU随机切换time.sleep(random.randint(1, 3))event.set()print(f'设定完成:{i}')if __name__ == '__main__':event = threading.Event()print('开始工作...')waiter = threading.Thread(target=waiter, args=(event, ))setter = threading.Thread(target=setter, args=(event, ))waiter.start()setter.start()waiter.join()setter.join()print('工作结束')

执行结果
在这里插入图片描述
注意这里等待时间在使用完成之后需要被clear清空重置

http://www.lryc.cn/news/578463.html

相关文章:

  • linux魔术字定位踩内存总结
  • 企业用哪个BI工具好?9款开源闭源PK
  • Milvus docker-compose 部署
  • 微软开源GitHub Copilot Chat,AI编程领域迎新突破
  • 商品中心—17.缓存与DB一致性的技术文档
  • 讯飞大模型实时语音识别
  • Set和Map的解析与应用场景
  • 集中式ZDM-E0400P3热电阻RTD测温模块(1) — 基础应用
  • WPF学习笔记(18)触发器Trigger
  • Postman - API 调试与开发工具 - 标准使用流程
  • Vue3 中 Excel 导出的性能优化与实战指南
  • 遥感影像岩性分类:基于CNN与CNN-EL集成学习的深度学习方法
  • 城市灯光夜景人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 【仿muduo库实现并发服务器】Poller模块
  • 华为交换机堆叠与集群技术深度解析附带脚本
  • 数字图像处理学习笔记
  • Python 可迭代的对象、迭代器 和生成器(Python 3.3中新出现的句法:yield from)
  • 静态工厂注入 vs 实例工厂注入
  • LINUX2.6设备注册与GPIO相关的API
  • FFmpeg 中./configure的解析
  • Linux基本命令篇 —— bc命令
  • 微软服务器安全问题
  • 【蓝牙】Linux Qt4查看已经配对的蓝牙信息
  • MCP 协议使用核心讲解
  • HDMI2.1 FRL流控 概览
  • 基于OPUS-MT模型的中译英程序实现
  • swing音频输入
  • Vue 安装使用教程
  • 【机器学习深度学习】模型微调的基本概念与流程
  • 动手实践:如何提取Python代码中的字符串变量的值