PySide6.QtCore.QSystemSemaphore

class QSystemSemaphore

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

概要

方法

静态函数

注意

本文档可能包含从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的系统信号量。参数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]])
Parameters:
  • key – str

  • initialValue – int

  • modeAccessMode

请求由旧键key标识的系统信号量。

acquire()
Return type:

布尔

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

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

另请参阅

release()

error()
Return type:

SystemSemaphoreError

返回一个值,指示是否发生了错误,如果是,则指示是哪个错误。

另请参阅

errorString()

errorString()
Return type:

字符串

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

另请参阅

error()

static isKeyTypeSupported(type)
Parameters:

类型Type

Return type:

布尔

key()
Return type:

字符串

返回分配给该系统信号量的旧版键。该键是其他进程可以访问信号量的名称。

另请参阅

setKey()

static legacyNativeKey(key[, type=QNativeIpcKey.legacyDefaultTypeForOs()])
Parameters:
Return type:

QNativeIpcKey

nativeIpcKey()
Return type:

QNativeIpcKey

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

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

另请参阅

setNativeKey()

static platformSafeKey(key[, type=QNativeIpcKey.DefaultTypeForOs])
Parameters:
Return type:

QNativeIpcKey

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

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

另请参阅

acquire()

setKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])
Parameters:
  • key – str

  • initialValue – int

  • modeAccessMode

此函数的工作方式与构造函数相同。它重建了这个QSystemSemaphore对象。如果新的key与旧的key不同,调用此函数就像是用旧key调用信号量的析构函数,然后用新key调用构造函数来创建一个新的信号量。initialValuemode参数与构造函数中的定义相同。

另请参阅

QSystemSemaphore() key()

setNativeKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open]])
Parameters:

此函数的工作方式与构造函数相同。它重建了这个QSystemSemaphore对象。如果新的key与旧的key不同,调用此函数就像是用旧的key调用信号量的析构函数,然后用新的key调用构造函数来创建一个新的信号量。initialValuemode参数与构造函数中的定义相同。

如果本机密钥是从另一个进程共享的,此函数非常有用。有关更多信息,请参见Native IPC Keys

另请参阅

QSystemSemaphore() nativeIpcKey()

setNativeKey(key[, initialValue=0[, mode=QSystemSemaphore.AccessMode.Open[, type=QNativeIpcKey.legacyDefaultTypeForOs()]]])
Parameters: