- class QSystemSemaphore#
类QSystemSemaphore提供了一个通用计数信号量。 更多…
概述#
方法#
def
__init__()
def
acquire()
def
error()
def
errorString()
def
key()
def
nativeIpcKey()
def
release()
def
setKey()
def
setNativeKey()
静态函数#
注释
本说明书可能包含从 C++ 自动翻译到 Python 的代码片段。我们总是欢迎对片段翻译的贡献。如果您发现翻译有误,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 上创建工单来告诉我们。
详细说明#
警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
系统信号量是
QSemaphore
的抽象。通常,信号量用于保护一定数量的相同资源。与它的轻量级对应物类似,一个
QSystemSemaphore
可以由多个线程
访问。与QSemaphore
不同,QSystemSemaphore
也可以由多个进程
访问。这意味着QSystemSemaphore
是一个更重的类,所以如果您的应用程序不需要在多个进程间访问信号量,您可能会想要使用QSemaphore
.信号量支持两个基本操作,
acquire()
和release()
acquire()
尝试获取一个资源。如果没有可用的资源,调用将阻塞,直到有资源可用。然后获取资源,并返回调用。release()
释放一个资源,以便其他进程可以获取它。函数也可以使用参数 n > 1 调用,释放 n 个资源。系统信号量通过一个密钥进行标识,密钥由
QNativeIpcKey
表示。密钥可以通过使用platformSafeKey
()在一个跨平台的方式中创建。一个系统信号量通过传递一个AccessMode::Create
的访问模式参数由QSystemSemaphore
构造函数创建。一旦创建,其他进程可以使用相同的密钥和访问模式参数AccessMode::Open
来附加到同一个信号量。示例:创建一个系统信号量
sem = QSystemSemaphore(QSystemSemaphore.platformSafeKey("market"), 3, QSystemSemaphore.Create) # resources available == 3 sem.acquire() # resources available == 2 sem.acquire() # resources available == 1 sem.acquire() # resources available == 0 sem.release() # resources available == 1 sem.release(2) # resources available == 3
有关密钥类型、平台特定限制和与旧版或非Qt应用程序的互操作性的详细信息,请参阅原生IPC密钥文档。这包括针对Apple平台上的沙箱应用程序的重要信息,包括通过Apple App Store获取的所有应用程序。
另请参阅
- class AccessMode#
此枚举由构造函数和
setKey()
使用。其目的是在Unix实现中的信号量解决方案中处理恢复崩溃的问题。在Unix中,当信号量在崩溃后幸存下来时,我们需要一种方式来强制它在系统重新使用信号量时重置其资源计数。在Windows中,由于信号量无法崩溃后幸存,此枚举没有效果。常数
描述
QSystemSemaphore.Open
如果信号量已经存在,则不会重置其初始资源计数。如果信号量尚不存在,则创建它并设置其初始资源计数。
QSystemSemaphore.Create
QSystemSemaphore
将接收信号量的所有权并将其资源计数设置为请求的值,无论该信号量是否已经存在而幸存于崩溃。当为特定密钥构造第一个信号量且已知如果信号量已存在,则只能是由于崩溃而存在时,应将此值传递给构造函数。在Windows中,由于信号量无法崩溃后幸存,创建和打开具有相同的行为。
- class SystemSemaphoreError#
常数
描述
QSystemSemaphore.NoError
没有发生错误。
QSystemSemaphore.PermissionDenied
操作失败,因为没有调用者所需的权限。
QSystemSemaphore.KeyError
操作失败,因为密钥无效。
QSystemSemaphore.AlreadyExists
操作失败,因为已存在具有指定密钥的系统信号量。
QSystemSemaphore.NotFound
操作失败,因为无法找到具有指定密钥的系统信号量。
QSystemSemaphore.OutOfResources
操作失败,因为可用内存不足,无法满足请求。
Q系统信号量.未知错误
发生了一些事情,而且情况很糟糕。
- __init__(key[, initialValue=0[, arg__3=QSystemSemaphore.AccessMode.Open]])#
- 参数::
key –
QNativeIpcKey
initialValue – int
arg__3 –
AccessMode
请求指定
key
的系统信号量。参数initialValue
和mode
将根据以下规则使用,这些规则依赖于系统。在 Unix 系统中,如果
mode
是Open
并且系统已经有一个通过key
标识的信号量,那么将使用该信号量,并且不会改变信号量的资源计数,即忽略initialValue
。但如果系统还没有通过key
标识的信号量,它将为该键创建一个新信号量并将其资源计数设置为initialValue
。在 Unix 系统中,如果
mode
是Create
并且系统已经有一个通过key
标识的信号量,那么将使用该信号量并将其资源计数设置为initialValue
。如果系统没有通过key
标识的信号量,它将为该键创建一个新信号量并将其资源计数设置为initialValue
。在 Windows 中,
mode
被忽略,系统总是尝试为指定的key
创建信号量。如果系统还没有标识为key
的信号量,它会创建该信号量并将其资源计数设置为initialValue
。但如果系统已经有一个标识为key
的信号量,它将使用该信号量并忽略initialValue
。mode
参数仅在 Unix 系统中使用,用于处理信号量在进程崩溃后仍存活的情况。在这种情况下,下一个使用相同key
分配信号量的进程将得到在崩溃过程中存活的信号量,并且除非mode
是Create
,否则资源计数不会重置为initialValue
,而是保留崩溃进程赋予的初始值。- __init__(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])
- 参数::
key – 字符串
initialValue – int
mode –
AccessMode
请求通过旧版键
key
标识的系统信号量。- acquire()#
- 返回类型::
布尔值
如果此信号量守护的资源中有可用资源,则获取一个资源,并返回
true
。如果所有由该信号量守护的资源都已获取,则调用将阻塞,直到另一个进程或线程释放其中一个(此信号量具有相同的键)。如果返回值为 false,则发生了系统错误。调用
error()
来获取指示发生哪个错误的SystemSemaphoreError
值。另请参阅
- error()#
- 返回类型::
返回一个值,表示是否发生错误及其错误类型。
另请参阅
- errorString()#
- 返回类型::
字符串
返回最近发生的错误的文本描述。如果
error()
返回一个错误值
,调用此函数以获取描述错误的文本字符串。另请参阅
- key()#
- 返回类型::
字符串
返回分配给此系统信号量的旧版键。该键是其他进程通过哪个键来访问信号量的名称。
另请参阅
- static legacyNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])#
- 参数::
key – 字符串
type –
Type
- 返回类型::
- nativeIpcKey()#
- 返回类型::
返回分配给此系统信号量的键。该键是从其他进程访问信号量的名称。
可以使用本地键来访问未由Qt创建的系统信号量,或授予非Qt应用程序的访问权限。有关更多信息,请参阅原生IPC键。
另请参阅
- static platformSafeKey(key[, type=QNativeIpcKey.DefaultTypeForOs])#
- 参数::
key – 字符串
type –
Type
- 返回类型::
- release([n=1])#
- 参数::
n – int
- 返回类型::
布尔值
警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
释放信号量保护的
n
个资源。如果发生系统错误,则返回true
。示例:创建拥有五个资源的系统信号量;获取它们,然后释放它们。
sem = QSystemSemaphore(QSystemSemaphore.platformSafeKey("market"), 5, QSystemSemaphore.Create) for (int i = 0 i < 5; ++i) # acquire all 5 resources sem.acquire() sem.release(5) # release the 5 resources
此函数还可以“创建”资源。例如,在上述语句序列之后,假设我们添加以下语句
sem.release(10) # "create" 10 resources()
现在有十个资源被信号量保护,除了已经存在的五个。通常不会使用此函数创建更多资源。
另请参阅
- setKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])#
- 参数::
key – 字符串
initialValue – int
mode –
AccessMode
此函数与构造函数的工作方式相同。它重建此
QSystemSemaphore
对象。如果新的key
与旧键不同,则调用此函数类似于调用带有旧键的信号量析构函数,然后调用构造函数以创建带有新key
的新信号量。initialValue
和mode
参数的定义与构造函数一致。另请参阅
QSystemSemaphore()
key()
- setNativeKey(key[, initialValue=0[, arg__3=QSystemSemaphore.AccessMode.Open]])#
- 参数::
key –
QNativeIpcKey
initialValue – int
arg__3 –
AccessMode
此函数与构造函数的工作方式相同。它重建此
QSystemSemaphore
对象。如果新的key
与旧键不同,则调用此函数类似于调用带有旧键的信号量析构函数,然后调用构造函数以创建带有新key
的新信号量。initialValue
和mode
参数的定义与构造函数一致。此函数如果本地密钥是从另一个进程共享的,将是很有用的。有关更多信息,请参阅本地IPC密钥。
另请参阅
QSystemSemaphore()
nativeIpcKey()
- setNativeKey(key[,initialValue=0[,mode=QSystemSemaphore.AccessMode.Open[,type=QNativeIpcKey.legacyDefaultTypeForOs()]]])
- 参数::
key – 字符串
initialValue – int
mode –
AccessMode
type –
Type