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 –
QNativeIpcKey
initialValue – 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 –
QNativeIpcKey
initialValue – 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 –
AccessMode
type –
类型