Python之信号量

Python之信号量

什么是信号量
信号量详解
案例

什么是信号量

从某种意义上来说,信号量和线程池很像,他们都会根据你设置的线程上限值来自动帮你管理线程,但是信号量更倾向于‘锁’的概念

  • 信号量是一种并发控制机制,用于限制对共享资源的并发访问数量。通过控制信号量的计数器,可以允许多个线程或进程同时访问一定数量的资源。信号量常用于解决生产者-消费者问题、限流等场景。
  • 线程池是一组预先创建的线程集合,用于执行任务队列中的任务。线程池管理了可复用的线程,并根据需要分配任务给空闲的线程进行处理。线程池提供了更好的线程管理、调度和性能优化,适用于大量短期任务的并发处理。

信号量详解

先看一个简单的多线程案例:

import threading
import timedef work(name):print(f'{name}进厕所了')time.sleep(1)print(f'{name}出厕所了')def main_thread():name = ['张三', '李四', '陈五', '王六', '横七', '竖八', ]t_l = []thread = [threading.Thread(target=work, args=(name[i],)) for i in range(5)]# 启动线程for t in thread:t.start()t_l.append(t)# 关闭线程for i in t_l:i.join()main_thread()

打印结果:

image-20240121211329476

现在我想把条件改为厕所一次只能进一人该怎么修改代码呢,在之前或许我们只能想到互斥锁一类的限制机制,而现在我们可以用信号量(Semaphore)解决

首先定义全局变量:

import threadingsema = threading.Semaphore(count)

count默认为1,其意义是控制线程访问资源的数量,可以使用acquire()添加,以及release()释放,通俗来讲就相当于变量**sema是厕所,count就是厕所的坑位,acquire()一次就是进来一个人,release()一次就是出去一个人**

def work(name):# 添加sema.acquire()print(f'{name}进厕所了')time.sleep(1)# 释放sema.release()print(f'{name}出厕所了')
def work(name):with sema:sema.release()print(f'{name}进厕所了')time.sleep(1)print(f'{name}出厕所了')

两种写法一样

案例

知晓了信号量的用法那么就可以修改之前的案例了

import threading
import timesema = threading.Semaphore(1)def work(name):with sema:sema.acquire()print(f'{name}进厕所了')time.sleep(1)print(f'{name}出厕所了')def main_thread():name = ['张三', '李四', '陈五', '王六', '横七', '竖八', ]t_l = []thread = [threading.Thread(target=work, args=(name[i],)) for i in range(5)]# 启动线程for t in thread:t.start()t_l.append(t)# 关闭线程for i in t_l:i.join()main_thread()

结果:

image-20240121212427826

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

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

相关文章

VSCode Python Windows环境下创建虚拟环境,隔离每个项目的依赖pip包,推荐使用!

VSCode Python Windows环境下创建虚拟环境 Visual Studio Code 可以隔离不同项目的pip依赖包,防止不同版本的干扰**(推荐使用)** 先在python官网https://www.python.org/downloads/下载需要的python版本(我选择了3.9.8&#xff09…

LeetCode.2765. 最长交替子数组

题目 2765. 最长交替子数组 分析 为了得到数组 nums 中的最长交替子数组的长度,需要分别计算以每个下标结尾的最长交替子数组的长度。为了方便处理,计算过程中需要考虑长度等于 1 的最长交替子数组,再返回结果时判断最长交替子数组的长度…

x-cmd pkg | speedtest-cli - 网络速度测试工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 speedtest-cli 是一个网络速度测试工具,用于测试计算机或服务器与速度测试服务器之间的网络连接速度。 它使用 speedtest.net 测试互联网带宽,可以帮助用户获取网络的上传和下载速度、延迟等参…

【目标检测】YOLOv7算法实现(二):正样本匹配(SimOTA)与损失计算

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github,删减了源码中部分内容,满足个人科研需求。   本篇文章在YOLOv5算法实现的基础上,进一步完成YOLOv7算法的实现。…

记录一次从有道云笔记迁移到语雀笔记

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 1、安装git,python3等准备工作 文章中标注python3,为避免与python2 冲…

Mac上如何设置映射某个网站站点域名的IP

最近某常用的站点换 IP 了,但是 DNS 服务器还没有修改,这就导致无法访问(换 DNS 服务器也不行)。在用了一段时间的 IP 访问之后,还是没好,不知道是 DNS 污染还是咋了,所以最后还是手动改一下吧。…

Docker镜像操作

镜像名称 镜名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是latest,代表最新版本的镜像。 这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。 镜像…

数字频率合成器dds的量化性能分析matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 DDS的基本原理 4.2 DDS的量化性能分析 5.完整工程文件 1.课题概述 数字频率合成器dds的量化性能分析matlab仿真,分别定义累加器位宽,截位位宽,模拟DAC位宽等&…

【数据结构与算法】3.顺序表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

软件设计师——软件工程(五)

📑前言 本文主要是【软件工程】——软件设计师——软件工程的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1f304…

解读 EventBridge Transform:数据转换和处理的灵活能力

作者:木则 阿里云 EventBridge 提供了强大而灵活的事件总线服务,它可以连接应用程序、阿里云云服务和阿里云 Serverless 服务来快速构建 EDA(Event-driven Architectures)事件驱动架构,驱动应用与应用,应用…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…