- class QSemaphore#
QSemaphore
类提供了一个通用的计数信号量。 更多信息...概要#
方法#
def
__init__()
def
acquire()
def
available()
def
release()
def
tryAcquire()
def
try_acquire()
注意
本文档可能包含从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
参见
- tryAcquire(n, timeout)
- 参数
n – int
timeout –
QDeadlineTimer
- 返回类型:
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
参见
- 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
参见
- try_acquire()#
- 返回类型:
bool
此函数是为与
std::counting_semaphore
兼容而提供的。它相当于调用
tryAcquire(1)
,其中函数在成功获取资源时返回true
。参见
tryAcquire()
try_acquire_for()
try_acquire_until()