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

Python教程-Python 信号量

教程- 信号量

在以下教程中,我们将了解如何在中使用信号量进行多线程同步。

让我们从了解信号量开始。

知晓信号量, 信号量乃一种同步构造, 信号量给线程予以对受限资源的同步访问, 信号量能够被视作是反映当下存在的资源数量的变量, 比如, 购物中心停车场的某一个级别之上有若干可用的车位, 这便是一个信号量, 信号量的值不可以小于零, 并且也不可以大于现有资源的总数, 信号量跟两个操作相关联, 即获取和释放, 当线程运用信号量同步其中一个资源时, 信号量的值会递减, 当线程释放信号量同步的一个资源时, 信号量的值会递增。信号量概念是由荷兰计算机科学家所创建的, 信号量存在两个操作, 就是获取以及释放, 这两个操作分别被表示成p和v, 其中p和v是荷兰单词的首字母相关的, 单词是用来表示测试这一含义的, 而另一个则是表示增加这一意思的。

现在让我们了解编程语言中的信号量。

鉴于想要了解信号量, 于是在其中, 运用模块的一个类去达成信号量概念的实现。而这个得以实现的类, 其中被称作信号量类。此信号量类涵盖一个构造函数, 以及两个函数, 分别是()与()。其中()函数, 其作用是当计数大于零这样的情形下, 便可对信号量计数予以减少。不然, 如果计数不大于零, 它就会进入阻塞状态, 这种阻塞状态会持续, 直至计数大于零。另外()函数, 其功能旨在增加信号量的计数并唤醒正在等待信号量的线程中的其中一个。

让我们考虑以下语法,以创建信号量对象。

语法:

object_name = Semaphore(count)

解释:

就上述所提及的语法而言, 存在着类的对象, 类存在着'count'参数, 此'count'参数就是那允许同时进行访问的线程数了, 而该相关参数的默认取值是为1。

每当执行那个函数的时候, “count”参数的值会减少一个。每当执行另一个函数的时候, “count”参数的值会增加一个。这意味着每当我们调用那个方法的时候, “count”参数值会递减, 而在调用另一个方法的时候, “count”参数值会递增。

创建信号量对象的方法

情况1: 于以下情形之下, 我们于创建对象之际, 并未对信号量类内的参数予以指定。所以, 计数变量的值是1, 故而仅准许一个线程施加访问。这般情况跟Lock概念完全相称。

下面是相同的语法:

语法:

object_name.Semaphore()

情形二: 于如下情形之时, 为对信号量类来讲的具象, 能够与此同时经由n个线程予以访问。剩余的那些线程必然得坐等信号量被释放方可。

下面是相同的语法:

语法:

object_name.Semaphore(n)

让我们考虑以下示例,以更好地理解整个概念。

示例:

# importing the modules from threading import * import time # creating thread instance where count = 3 my_obj = Semaphore(4) # creating instance def show(the_name): # calling acquire method my_obj.acquire() for n in range(6): print('javatiku, ', end = '') time.sleep(1) print(the_name) # calling release method my_obj.release() # creating multiple thread thread_1 = Thread(target = show , args = ('Thread 1',)) thread_2 = Thread(target = show , args = ('Thread 2',)) thread_3 = Thread(target = show , args = ('Thread 3',)) thread_4 = Thread(target = show , args = ('Thread 4',)) thread_5 = Thread(target = show , args = ('Thread 5',)) thread_6 = Thread(target = show , args = ('Thread 6',)) # calling the threads thread_1.start() thread_2.start() thread_3.start() thread_4.start() thread_5.start() thread_6.start()

输出

javatiku, javatiku, javatiku, javatiku, Thread 1 Thread 3 Thread 4 Thread 2 javatiku, javatiku, javatiku, javatiku, javatiku, javatiku, Thread 1 Thread 5 javatiku, javatiku, Thread 6 Thread 3 Thread 4 javatiku, javatiku, Thread 2 javatiku, javatiku, Thread 5 javatiku, Thread 1 javatiku, Thread 3 javatiku, Thread 6 Thread 2 Thread 4 javatiku, javatiku, javatiku, Thread 5 javatiku, Thread 1 javatiku, Thread 3 javatiku, Thread 6 Thread 2 javatiku, javatiku, Thread 4 javatiku, Thread 5 javatiku, Thread 1 Thread 3 javatiku, javatiku, Thread 2 Thread 6 javatiku, javatiku, Thread 4 javatiku, Thread 5 javatiku, Thread 1 Thread 3 Thread 2 Thread 6 javatiku, Thread 4 Thread 5 Thread 6

解释:

在上面的代码片段当中, 我们所做的是, 先导入了所需用到的模块, 接着为类创建了一个计数值是4的对象, 随后, 定义了一个函数, 这个函数使用对象上的()函数, 之后, 运用for循环来迭代值直至6, 再然后, 调用了()函数并创建了多个线程, 最终, 使用start()函数调用了这些线程。

标签有教程, 有安装相关内容, 还有库, 有入门方面, 有学习, 有入门教程, 有进阶, 有指南, 有学习指南,另外还有进阶教程以及编程。

http://www.cnnetsun.cn/news/4258835.html

相关文章:

  • MATLAB快速入门:两天掌握数学建模核心编程与可视化
  • 数学建模竞赛中写手的核心职责与实战技能全解析
  • 深度学习复试项目-04:卷积神经网络前向传播模型
  • 深入理解C++ I/O流:从基础概念到文件操作与错误处理实战
  • Python 中如何实现多线程?
  • C++函数模板实战:从距离计算到泛型编程核心原理
  • 浏览器鼓机音序器进阶:Web Audio时钟调度与架构拆解
  • 做弱电工程,这些线材一定要认识
  • 基于Django与Python的适老化健康预警系统:架构设计与工程实践
  • FANUC上位机开发实战:C#连接PMC与MES回传设计
  • 从数学建模到数据挖掘实战:古代玻璃成分分析全流程解析
  • 不会Python?AI帮你写脚本,自动化办公(保姆级教程)
  • chatgpt赋能python:Python可以跨平台吗?
  • 基于YOLOv11的柑橘果柄识别:从数据集构建到模型部署的完整实践
  • 工业级智能决策系统:DSAC+双层MLP落地实践
  • 3 个独立开发者,用 AI 给自己做了融资 FA、求职诊断和效率工具
  • 基于样本平均近似与机器学习的血管机器人订购策略建模与Matlab实现
  • 从集合到范畴:图解范畴论核心概念与编程实践
  • 蓝桥杯国赛真题“123”解析:从数学规律到二分查找的算法优化实践
  • Python模拟退火算法求解整数规划:从原理到实战调优
  • 原码、反码、补码与位运算(与/或/异或/取反)
  • Python数学建模实战:数据拟合、优化与蒙特卡洛模拟核心技巧
  • Agentic RAG工作流:轻量级智能体问答系统实战
  • 线性规划建模与求解:从数学建模到MATLAB/Python实战
  • C++模板类与STL实战:构建泛型数据管理器的工程化指南
  • 气动系统电磁阀选型
  • Signal拟推免手机号注册:一次性付费背后的账号体系设计与反滥用权衡
  • 蓝桥杯国赛“扩散”题解:从BFS模拟到曼哈顿距离的算法优化
  • VOC格式路面缺陷数据集的工程化解析与实战指南
  • AI助理技术拆解:用RAG打造企业知识库实战