PySide6.QtCore.QSystemSemaphore¶
- 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可以从多个threads访问。与QSemaphore不同,QSystemSemaphore也可以从多个processes访问。这意味着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应用程序的互操作性的详细信息,请参阅Native IPC Keys文档。其中包括关于Apple平台上沙盒应用程序的重要信息,包括通过Apple App Store获得的所有应用程序。
另请参阅
- class AccessMode¶
此枚举由构造函数和
setKey()使用。其目的是为了在Unix实现中处理信号量在崩溃后仍然存在的问题。在Unix中,当信号量在崩溃后仍然存在时,我们需要一种方法在系统重用信号量时强制重置其资源计数。在Windows中,信号量无法在崩溃后存活,因此此枚举没有效果。常量
描述
QSystemSemaphore.Open
如果信号量已经存在,其初始资源计数不会被重置。如果信号量不存在,它将被创建并设置其初始资源计数。
QSystemSemaphore.Create
QSystemSemaphore取得信号量的所有权并将其资源计数设置为请求的值,无论信号量是否已经因为崩溃而存在。当为特定键构造第一个信号量时,并且你知道如果信号量已经存在,那只能是因为崩溃,这个值应该传递给构造函数。在Windows中,信号量无法在崩溃后存活,Create和Open的行为相同。
- class SystemSemaphoreError¶
常量
描述
QSystemSemaphore.NoError
没有发生错误。
QSystemSemaphore.PermissionDenied
操作失败,因为调用者没有所需的权限。
QSystemSemaphore.KeyError
操作失败,因为使用了无效的键。
QSystemSemaphore.AlreadyExists
操作失败,因为具有指定键的系统信号量已经存在。
QSystemSemaphore.NotFound
操作失败,因为找不到具有指定键的系统信号量。
QSystemSemaphore.OutOfResources
操作失败,因为没有足够的内存来满足请求。
QSystemSemaphore.UnknownError
发生了其他不好的事情。
- __init__(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])¶
- Parameters:
key –
QNativeIpcKeyinitialValue – int
mode –
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]])
- Parameters:
key – str
initialValue – int
mode –
AccessMode
请求由旧键
key标识的系统信号量。- acquire()¶
- Return type:
布尔
获取此信号量保护的资源之一(如果有可用资源),并返回
true。如果此信号量保护的所有资源都已被获取,则调用将阻塞,直到其中一个资源被具有相同键的信号量的另一个进程或线程释放。如果返回 false,则表示发生了系统错误。调用
error()以获取SystemSemaphoreError的值,该值指示发生了哪个错误。另请参阅
- error()¶
- Return type:
返回一个值,指示是否发生了错误,如果是,则指示是哪个错误。
另请参阅
- errorString()¶
- Return type:
字符串
返回最后一次发生的错误的文本描述。如果
error()返回一个error value,调用此函数以获取描述错误的文本字符串。另请参阅
- key()¶
- Return type:
字符串
返回分配给该系统信号量的旧版键。该键是其他进程可以访问信号量的名称。
另请参阅
- static legacyNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])¶
- Parameters:
key – str
type –
类型
- Return type:
- nativeIpcKey()¶
- Return type:
返回分配给该系统信号量的键。该键是其他进程可以访问信号量的名称。
您可以使用原生键访问未由Qt创建的系统信号量,或授予非Qt应用程序访问权限。有关更多信息,请参见Native IPC Keys。
另请参阅
- static platformSafeKey(key[, type=QNativeIpcKey.DefaultTypeForOs])¶
- Parameters:
key – str
type –
类型
- Return type:
- release([n=1])¶
- Parameters:
n – 整数
- Return type:
布尔
警告
本节包含从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]])¶
- Parameters:
key – str
initialValue – int
mode –
AccessMode
此函数的工作方式与构造函数相同。它重建了这个
QSystemSemaphore对象。如果新的key与旧的key不同,调用此函数就像是用旧key调用信号量的析构函数,然后用新key调用构造函数来创建一个新的信号量。initialValue和mode参数与构造函数中的定义相同。另请参阅
QSystemSemaphore()key()- setNativeKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])¶
- Parameters:
key –
QNativeIpcKeyinitialValue – int
mode –
AccessMode
此函数的工作方式与构造函数相同。它重建了这个
QSystemSemaphore对象。如果新的key与旧的key不同,调用此函数就像是用旧的key调用信号量的析构函数,然后用新的key调用构造函数来创建一个新的信号量。initialValue和mode参数与构造函数中的定义相同。如果本机密钥是从另一个进程共享的,此函数非常有用。有关更多信息,请参见Native IPC Keys。
另请参阅
QSystemSemaphore()nativeIpcKey()- setNativeKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open[, type=QNativeIpcKey.legacyDefaultTypeForOs()]]])
- Parameters:
key – str
initialValue – int
mode –
AccessModetype –
类型