Python 中的信号量
在本篇文章中,我们将学习如何使用信号量在 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
请注意
,信号量释放线程所需的时间取决于您设备的速度,并且每次都会有所不同。 您可以通过更改信号量实例中的计数值来测试上述代码。
相关文章
在 Python 中的日志记录库的帮助下使用 Log4j
发布时间:2023/06/14 浏览次数:131 分类:Python
-
本文解释了 log4j、它的工作原理及其使用重要性。 我们还将探索如何在日志库的帮助下在 Python 编程语言中使用 log4j。
在 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 中抛出异常