迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中的信号量

作者:迹忆客 最近更新:2023/06/14 浏览次数:

在本篇文章中,我们将学习如何使用信号量在 Python 中处理多线程。 如何同步访问线程和有限数量的资源?


信号量

同步控制器是一个信号量。 信号量为线程提供对有限数量资源的同步访问。

信号量可以被视为表示现在有多少资源可用的变量。

例如,商场中用作信号量的停车场在给定层上有多个可用空间。

信号量的值必须大于或小于可用资源。 acquire 和release 操作与信号量相关联。

当用于同步的资源之一被线程“获取”时,信号量的值会降低。 当同步资源之一被线程“释放”时,信号量的值会增加。


Python 中的信号量

Python 对信号量概念的实现使用了线程模块中的一个类。 信号量是这个类的名字。

acquire()release() 函数都包含在 Semaphore 类中,还有一个函数构造函数。

如果信号量计数大于零,则使用 acquire() 函数降低计数。 如果不是,它将阻塞直到计数大于 0。

使用 release() 函数唤醒位于信号量上的线程之一,这也增加了信号量的计数。 现在让我们了解信号量的语法。

object_name = threading.Semaphore(count)

Semaphore 类对象由上面语法中的 object_name 指示。

一次允许访问的线程数由 Semaphore 类的 count 参数指定。 该参数的默认值为 1。

线程每次使用 acquire() 函数时,count 参数的值都会减一。 线程每次使用 release() 函数时,count 参数的值都会增加 1。

根据这个说法,任何时候我们调用 acquire() 方法,count参数的值都会减少; 但是,当我们调用 release() 函数时,count 参数的值会增加。 看看下面的代码。

#import threading module
import threading

#creating instance of semaphore
sema = threading.Semaphore(1)


def test():
    #appling semaphore
    print(f"Value Of Semaphore --> {sema._value}")
    sema.acquire()
    print(f"acquired lock --> {threading.current_thread().name}")
    print(f"Value Of Semaphore --> {sema._value}")
    print(f"release lock --> {threading.current_thread().name}")
    sema.release()
    print(f"Value Of Semaphore --> {sema._value}")

#initializing threads
t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t3 = threading.Thread(target=test)
#executing threads
t1.start()
t2.start()
t3.start()

如果 count 设置为 1,线程将被同步,如上面的代码所示。 如果我们查看上面代码的输出,我们会注意到它是第一个和第二个线程,然后第三个线程可以访问获取和释放之间的代码。

Value Of Semaphore --> 1
Value Of Semaphore --> 1
acquired lock --> Thread-1 (test)
Value Of Semaphore --> 0
Value Of Semaphore --> 0
release lock --> Thread-1 (test)
Value Of Semaphore --> 1
acquired lock --> Thread-2 (test)
Value Of Semaphore --> 0
release lock --> Thread-2 (test)
Value Of Semaphore --> 1
acquired lock --> Thread-3 (test)
Value Of Semaphore --> 0
release lock --> Thread-3 (test)
Value Of Semaphore --> 1

如果您要将计数值从 1 更改为 2,您将允许两个线程同时访问受限代码。 所以,输出会有所不同。

Value Of Semaphore --> 2
acquired lock --> Thread-1 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 1
release lock --> Thread-1 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 1
acquired lock --> Thread-3 (test)
acquired lock --> Thread-2 (test)
Value Of Semaphore --> 0
Value Of Semaphore --> 0
release lock --> Thread-2 (test)
release lock --> Thread-3 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 2

请注意 ,信号量释放线程所需的时间取决于您设备的速度,并且每次都会有所不同。 您可以通过更改信号量实例中的计数值来测试上述代码。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Python 中使用 setLevel() 设置日志级别

发布时间:2023/06/14 浏览次数:82 分类:Python

Python 提供了一个单独的日志记录模块作为其标准库的一部分,以简化日志记录。 本文将讨论日志记录 setLevel 及其在 Python 中的工作方式。Python登录程序的功能

Python 日志记录传播

发布时间:2023/06/14 浏览次数:174 分类:Python

本文介绍了 LevelFilter 的使用,以显示如何将特定级别及更高级别(例如,INFO 及更高级别)的特定记录器名称的消息记录到特定的日志处理程序。Python 日志记录传播

Python 全局日志记录器

发布时间:2023/06/14 浏览次数:146 分类:Python

本文介绍 Python 中的日志记录模块。 它还介绍了日志记录级别及其重要性,从而生成了一个代码示例,演示了 Python 日志记录模块的全局使用。

在 Python 中可视化树

发布时间:2023/06/14 浏览次数:150 分类:Python

由于许多不同的原因,决策树是一种常见的监督学习技术。 决策树的优点包括我们可以将它们用于分类和回归,它们不需要特征缩放,而且决策树易于阅读。本文介绍了 Python 的 Graphviz 来显示

在 Python 中打印二叉树

发布时间:2023/06/14 浏览次数:101 分类:Python

本文将讨论二叉树以及我们如何使用它。 我们还将看到如何使用 Python 打印它。我们将了解在处理二叉树时使用的术语。 我们还将研究使用 Python 代码的二叉树示例。

Python 中的二维插值

发布时间:2023/06/14 浏览次数:149 分类:Python

本文展示了如何在 Python 中进行插值,并研究了不同的 2d 实现方法。 我们将讨论用于双变量插值的有用函数,例如 scipy.interpolate.interp2d、numpy.meshgrid 和 Python 中使用的用于平滑/插值 (RBF) 的径向

Python 中的 3D 插值

发布时间:2023/06/13 浏览次数:121 分类:Python

插值是在离散集的定义范围内构造新数据点的方法。 插值意味着找到点或曲线之间的值。从数学的角度来看,插值是获取位于其他已知数据点之间的特定未知数据点的值。插值的重要性

在 Python 中重新抛出异常

发布时间:2023/06/13 浏览次数:53 分类:Python

Python 为我们提供了 try-except 块来处理程序中的异常。 它还为我们提供了 raise 语句来手动抛出异常。本文将讨论如何在 Python 程序中重新抛出异常。在 Python 中抛出异常

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便