news 2026/8/28 4:45:09

Python教程-Python 信号量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()函数调用了这些线程。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 4:44:31

MATLAB快速入门:两天掌握数学建模核心编程与可视化

1. 项目概述:两天搞定MATLAB实战编程如果你正在备战数学建模,或者任何需要快速上手MATLAB进行科学计算、数据分析的场合,却被它庞大的功能库和看似复杂的语法劝退,那么这篇内容就是为你准备的。我见过太多同学在赛前对着MATLAB发怵…

作者头像 李华
网站建设 2026/8/28 4:44:24

数学建模竞赛中写手的核心职责与实战技能全解析

1. 项目概述:数学建模写手的真实画像很多人一听到“数学建模”,脑海里浮现的可能是复杂的公式推导、深奥的算法和一群埋头苦算的“学霸”。而“写手”这个词,又常常让人联想到代笔、文案。当这两个词结合在一起——“数学建模写手”&#xff…

作者头像 李华
网站建设 2026/8/28 4:39:11

深度学习复试项目-04:卷积神经网络前向传播模型

AlexNet模型:网络整体结构输入:227×227×3 RGB 图像(注意论文写 224,实际有效输入 227) 一共 8 层可训练层:5 层卷积 + 3 层全连接,最后 Softmax 输出 1000 分类。层卷积配置输出尺寸Conv1Conv 11×11,stride=4,96,无 padding55&time…

作者头像 李华
网站建设 2026/8/28 4:38:23

深入理解C++ I/O流:从基础概念到文件操作与错误处理实战

1. 从“Hello World”到“Hello System”&#xff1a;C输入输出的本质很多朋友学C&#xff0c;都是从一行cout << "Hello World"开始的。这行代码简单直观&#xff0c;仿佛输入输出就是理所当然的事情。但当你真正开始写一个需要处理用户输入、读取配置文件、或…

作者头像 李华
网站建设 2026/8/28 4:34:38

Python 中如何实现多线程?

接口速度明明不迟缓, 单个请求只需200毫秒, 然而批量运行5000个, 居然需要十几分钟。有不少这样的代码, 是我见过很多的, 看一下打开之后, 基本上都是从开头一直怼整个流程呈现持续状态, 运用的是一个for循环操作:for user_id in user_ids: profile load_user_profile(user_id…

作者头像 李华
网站建设 2026/8/28 4:33:47

C++函数模板实战:从距离计算到泛型编程核心原理

1. 从“硬编码”到“泛型计算”&#xff1a;为什么我们需要函数模板在C编程实践中&#xff0c;计算两点间的距离是一个再常见不过的需求。无论是游戏开发中的碰撞检测、图形学中的坐标变换&#xff0c;还是数据分析中的聚类算法&#xff0c;这个基础操作无处不在。最初接触这个…

作者头像 李华