迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便