PySide6.QtCore.QSemaphore

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人的团体等待更长时间)。

另请参阅

QSemaphoreReleaser QMutex QWaitCondition QThread 使用信号量的生产者和消费者

__init__([n=0])
Parameters:

n – 整数

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

另请参阅

release() available()

acquire([n=1])
Parameters:

n – 整数

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

available()
Return type:

整数

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

另请参阅

acquire() release()

release([n=1])
Parameters:

n – 整数

警告

本节包含从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])
Parameters:

n – 整数

Return type:

布尔

警告

本节包含从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)
Parameters:
Return type:

布尔

警告

本节包含从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)
Parameters:
  • n – 整数

  • timeout – int

Return type:

布尔

警告

本节包含从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()