class QSystemSemaphore#

QSystemSemaphore提供了一个通用计数信号量。 更多

概述#

方法#

静态函数#

注释

本说明书可能包含从 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 的系统信号量。参数 initialValuemode 将根据以下规则使用,这些规则依赖于系统。

在 Unix 系统中,如果 modeOpen 并且系统已经有一个通过 key 标识的信号量,那么将使用该信号量,并且不会改变信号量的资源计数,即忽略 initialValue。但如果系统还没有通过 key 标识的信号量,它将为该键创建一个新信号量并将其资源计数设置为 initialValue

在 Unix 系统中,如果 modeCreate 并且系统已经有一个通过 key 标识的信号量,那么将使用该信号量并将其资源计数设置为 initialValue。如果系统没有通过 key 标识的信号量,它将为该键创建一个新信号量并将其资源计数设置为 initialValue

在 Windows 中,mode 被忽略,系统总是尝试为指定的 key 创建信号量。如果系统还没有标识为 key 的信号量,它会创建该信号量并将其资源计数设置为 initialValue。但如果系统已经有一个标识为 key 的信号量,它将使用该信号量并忽略 initialValue

mode 参数仅在 Unix 系统中使用,用于处理信号量在进程崩溃后仍存活的情况。在这种情况下,下一个使用相同 key 分配信号量的进程将得到在崩溃过程中存活的信号量,并且除非 modeCreate ,否则资源计数不会重置为 initialValue,而是保留崩溃进程赋予的初始值。

另请参阅

acquire() key()

__init__(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])
参数::
  • key – 字符串

  • initialValue – int

  • modeAccessMode

请求通过旧版键 key 标识的系统信号量。

acquire()#
返回类型::

布尔值

如果此信号量守护的资源中有可用资源,则获取一个资源,并返回 true。如果所有由该信号量守护的资源都已获取,则调用将阻塞,直到另一个进程或线程释放其中一个(此信号量具有相同的键)。

如果返回值为 false,则发生了系统错误。调用 error() 来获取指示发生哪个错误的 SystemSemaphoreError 值。

另请参阅

release()

error()#
返回类型::

SystemSemaphoreError

返回一个值,表示是否发生错误及其错误类型。

另请参阅

errorString()

errorString()#
返回类型::

字符串

返回最近发生的错误的文本描述。如果 error() 返回一个 错误值,调用此函数以获取描述错误的文本字符串。

另请参阅

error()

静态isKeyTypeSupported(type)#
参数::

typeType

返回类型::

布尔值

key()#
返回类型::

字符串

返回分配给此系统信号量的旧版键。该键是其他进程通过哪个键来访问信号量的名称。

另请参阅

setKey()

static legacyNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])#
参数::
  • key – 字符串

  • typeType

返回类型::

QNativeIpcKey

nativeIpcKey()#
返回类型::

QNativeIpcKey

返回分配给此系统信号量的键。该键是从其他进程访问信号量的名称。

可以使用本地键来访问未由Qt创建的系统信号量,或授予非Qt应用程序的访问权限。有关更多信息,请参阅原生IPC键

另请参阅

setNativeKey()

static platformSafeKey(key[, type=QNativeIpcKey.DefaultTypeForOs])#
参数::
  • key – 字符串

  • typeType

返回类型::

QNativeIpcKey

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()

现在有十个资源被信号量保护,除了已经存在的五个。通常不会使用此函数创建更多资源。

另请参阅

acquire()

setKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])#
参数::
  • key – 字符串

  • initialValue – int

  • modeAccessMode

此函数与构造函数的工作方式相同。它重建此 QSystemSemaphore 对象。如果新的 key 与旧键不同,则调用此函数类似于调用带有旧键的信号量析构函数,然后调用构造函数以创建带有新 key 的新信号量。 initialValuemode 参数的定义与构造函数一致。

另请参阅

QSystemSemaphore() key()

setNativeKey(key[, initialValue=0[, arg__3=QSystemSemaphore.AccessMode.Open]])#
参数::

此函数与构造函数的工作方式相同。它重建此 QSystemSemaphore 对象。如果新的 key 与旧键不同,则调用此函数类似于调用带有旧键的信号量析构函数,然后调用构造函数以创建带有新 key 的新信号量。 initialValuemode 参数的定义与构造函数一致。

此函数如果本地密钥是从另一个进程共享的,将是很有用的。有关更多信息,请参阅本地IPC密钥

另请参阅

QSystemSemaphore() nativeIpcKey()

setNativeKeykey[initialValue=0[mode=QSystemSemaphore.AccessMode.Open[type=QNativeIpcKey.legacyDefaultTypeForOs()]]]
参数::
  • key – 字符串

  • initialValue – int

  • modeAccessMode

  • typeType