class QSemaphore#

QSemaphore 类提供了一个通用的计数信号量。 更多信息...

概要#

方法#

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,也可以在https:/bugreports.qt.io/projects/PYSIDE上创建工单来告诉我们。

详细描述#

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

信号量是一种锁的通用形式。虽然锁只能被锁定一次,但信号量可以被获取多次。信号量通常用于保护一定数量的相同资源。

信号量支持两种基本操作,acquire()release()

  • acquire(n) 尝试获取 n 个资源。如果没有这么多的资源可用,调用将会阻塞,直到资源可用。

  • release(n) 释放 n 个资源。

还有一个返回值,tryAcquire() 函数,如果无法获取资源则立即返回,以及一个返回任意时刻可用资源数量的 available() 函数。

示例

QSemaphore sem(5) # sem.available() == 5
sem.acquire(3) # sem.available() == 2
sem.acquire(2) # sem.available() == 0
sem.release(5) # sem.available() == 5
sem.release(5) # sem.available() == 10
sem.tryAcquire(1) # sem.available() == 9, returns true
sem.tryAcquire(250) # sem.available() == 9, returns false

信号量的典型应用是控制生产者和消费者线程共享的循环缓冲区。在使用信号量的生产和消费 示例中,展示了如何使用 QSemaphore 解决这个问题。

信号量的非计算机示例是餐馆用餐。信号量用餐厅的椅子数作为初始化值。当人们到达时,他们想要一个座位。当椅子被占据时,available()(可用资源)的值减少。当人们离开时,available() 的值增加,允许更多人进入。如果有一组10个人想要坐下,但只有9个座位,那么这10个人将等待,一组4个人会坐下(把可用座位增加到5,从而使10个人的组需要等待更长的时间)。

__init__([n=0])#
参数

n – int

创建一个新的信号量,并将保护的资源数量初始化为 n(默认为0)。

acquire([n=1])#
参数

n – int

尝试获取信号量保护的 n 个资源。如果 n 大于 available(),则此调用将阻塞,直到有足够的资源可用。

available()#
返回类型:

int

返回信号量当前可用的资源数量。这个数字永远不会是负数。

release([n=1])#
参数

n – int

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

释放信号量保护的 n 个资源。

此函数也可以用来“创建”资源。例如

QSemaphore sem(5) # a semaphore that guards 5 resources
sem.acquire(5) # acquire all 5 resources
sem.release(5) # release the 5 resources
sem.release(10) # "create" 10 resources()

QSemaphoreReleaser 是此函数的一个 RAII 包装器。

tryAcquire([n=1])#
参数

n – int

返回类型:

bool

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

尝试获取由信号量保护的 n 资源,并在成功时返回 true。如果 available() < n,则此调用将立即返回 false 而不获取任何资源。

示例

QSemaphore sem(5) # sem.available() == 5
sem.tryAcquire(250) # sem.available() == 5, returns false
sem.tryAcquire(3) # sem.available() == 2, returns true

参见

acquire()

tryAcquire(n, timeout)
参数
返回类型:

bool

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

尝试获取由信号量保护的 n 资源,并在成功时返回 true。如果 available() < n,则此调用将等待,直到 timer 到期,以等待资源变得可用。

示例

QSemaphore sem(5) # sem.available() == 5
sem.tryAcquire(250, QDeadlineTimer(1000)) # sem.available() == 5, waits 1000 milliseconds and returns false
sem.tryAcquire(3, QDeadlineTimer(30s)) # sem.available() == 2, returns true without waiting

参见

acquire()

tryAcquire(n, timeout)
参数
  • n – int

  • timeout – int

返回类型:

bool

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

尝试获取由信号量保护的 n 资源,并在成功时返回 true。如果 available() < n,则此调用将在最多 timeout 毫秒内等待资源变得可用。

注意:将负数作为 timeout 等同于调用 acquire(),即如果 timeout 为负,则此函数将无限期等待资源变得可用。

示例

QSemaphore sem(5) # sem.available() == 5
sem.tryAcquire(250, 1000) # sem.available() == 5, waits 1000 milliseconds and returns false
sem.tryAcquire(3, 30000) # sem.available() == 2, returns true without waiting

参见

acquire()

try_acquire()#
返回类型:

bool

此函数是为与 std::counting_semaphore 兼容而提供的。

它相当于调用 tryAcquire(1),其中函数在成功获取资源时返回 true

参见

tryAcquire() try_acquire_for() try_acquire_until()