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

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

猜你喜欢

转载自blog.csdn.net/fengqianlang/article/details/131584958