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
请注意
,信号量释放线程所需的时间取决于您设备的速度,并且每次都会有所不同。 您可以通过更改信号量实例中的计数值来测试上述代码。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串