class QLockFile#

使用文件提供的类《a class="reference internal" href="#PySide6.QtCore.QLockFile" title="PySide6.QtCore.QLockFile">QLockFile提供进程间的锁定。更多

概述#

方法#

注释

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您看到翻译问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE

详细描述#

锁文件可以用来防止多个进程同时访问同一资源。例如,磁盘上的配置文件、套接字、端口、共享内存区域等。

只有当所有访问共享资源的进程都使用相同文件路径的QLockFile 时,序列化才得到保证。

QLockFile 支持两种用法:为了短期的操作(例如,在保存新的设置之前检查配置文件是否更改)保护资源,以及长期保护资源(例如,用户在编辑器中打开的文档)而不确定的时间。

对于短期的保护操作,可以调用 lock() 并等待任何运行的操作完成。然而,如果长时间保护资源,应用程序应始终调用 setStaleLockTime(0毫秒)然后使用短超时调用 tryLock(),以警告用户资源已被锁定。

如果持有锁的进程崩溃,锁文件将保持在磁盘上,可能会阻止任何其他进程访问共享资源。因此,QLockFile 尝试根据文件中写入的进程ID检测这种“过时的”锁文件。为了处理进程ID在此期间被重用的情形,将当前进程名称与锁文件中对应进程ID的进程名称进行比较。如果进程名称不同,则认为锁文件过时。此外,还考虑了锁文件的最后修改时间(默认为30秒,适用于短期操作)。

因此,对于长期保护资源的用例,应该调用 setStaleLockTime(0),当 tryLock() 返回 LockFailedError 时,通知用户文档已被锁定,可能使用 getLockInfo() 获取更多详细信息。

注释

在Windows上,如果机器的主机名包含US-ASCII字符集之外的字符,则此类在检测陈旧的锁方面存在问题。

class LockError#

此枚举描述了上次调用lock()tryLock() 的结果。

常量

描述

QLockFile.NoError

锁获取成功。

QLockFile.LockFailedError

由于另一个进程持有锁,无法获取锁。

QLockFile.PermissionError

由于父目录权限不足,无法创建锁文件。

QLockFile.UnknownError

发生其他错误,例如分区满阻止写入锁文件。

__init__(fileName)#
参数:

fileName - str

构造新的锁文件对象。对象在未锁定状态下创建。当调用lock()tryLock() 时,如果不存在,将创建名为fileName的锁文件。

另请参阅

lock() unlock()

error()#
返回类型:

LockError

返回锁文件错误状态。

如果tryLock() 返回 false,则可以调用此函数以找出锁定失败的原因。

fileName()#
返回类型:

str

返回锁文件的文件名

getLockInfo()#
返回类型:

(int, str, str)

检索有关锁文件当前所有者的信息。

如果tryLock() 返回 false,并且error() 返回LockFailedError,则可以调用此函数以获取有关现有锁文件的更多信息。

  • 应用的PID(在pid中返回)

  • 它运行的 hostname(在网络化文件系统中很有用),

  • 创建它的应用程序的名称(在 appname 中返回),

请注意,如果没有任何运行中的应用程序具有此 PID,则 tryLock() 会自动删除文件,因此只有在有此 PID 的应用程序时才会发生 LockFailedError(它可能毫不相关)。

这可以用来通知用户现有锁文件,并让他们选择是否删除它。在用 removeStaleLockFile() 删除文件后,应用程序可以再次调用 tryLock()

如果成功检索到信息,此函数返回 true,如果锁文件不存在或不包含预期的数据,则返回 false。这可能发生在在 tryLock() 失败的时间和调用此函数之间删除了锁文件。如果发生这种情况,只需再次调用 tryLock() 即可。

isLocked()#
返回类型:

bool

如果通过此 QLockFile 实例获得了锁,则返回 true,否则返回 false

另请参阅

lock() unlock() tryLock()

lock()#
返回类型:

bool

创建锁文件。

如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将阻塞,直到该进程(或线程)释放它。

不允许从同一线程在同一锁上多次调用此函数而没有先解锁。如果文件递归锁定,则此函数将 死锁

如果成功获取锁,则返回 true,如果由于不可恢复的错误(例如父目录没有权限)无法获取锁,则返回 false

另请参阅

unlock() tryLock()

removeStaleLockFile()#
返回类型:

bool

尝试强制删除现有的锁文件。

在保护短期操作时不建议调用此方法:当 QLockFile 超过 staleLockTime() 定义的时间后,它已经会自动删除锁文件。

只有在保护长期资源时才应调用此方法,即当 staleLockTime (0) 设置时,并且 tryLock() 返回 LockFailedError 且用户同意删除锁文件时。

成功返回 true,如果锁文件无法删除则返回 false。在 Windows 上,当拥有锁的应用程序仍在运行时会发生这种情况。

setStaleLockTime(arg__1)#
参数:

arg__1 – int

staleLockTime 设置为锁文件被认为是过期的毫秒数。默认值是 30000,即 30 秒。如果你的应用程序通常会在 30 秒以上锁定文件(例如保存数兆字节数据 2 分钟),你应该使用 setStaleLockTime() 设置一个更大的值。

staleLockTime 的值被 lock()tryLock() 使用,以确定 existing 锁文件何时被认为是过期的,即由崩溃的进程留下的。这在 PID 同时被重用时非常有用,因此检测一个过期的锁文件的一种方法就是它已经存在了很长时间。

这是一个重载的函数,等同于调用

setStaleLockTime(std::chrono::milliseconds{staleLockTime});

另请参阅

staleLockTime()

staleLockTime()#
返回类型:

int

返回锁文件被认为是过期的毫秒数。

另请参阅

setStaleLockTime()

tryLock(timeout)#
参数:

timeout – int

返回类型:

bool

尝试创建锁文件。此函数返回 true,如果成功获得锁;否则返回 false。如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将等待最多 timeout 毫秒,直到锁文件可用。

注意:将负数传递给 timeout 等同于调用 lock() ,即如果 timeout 为负,则此函数将无限期等待直到锁文件可以被锁定。

获取锁后,必须使用 unlock() 释放,否则另一个进程(或线程)无法成功锁定它。

不允许从同一线程多次调用此函数锁定同一个锁而不先释放,当尝试递归锁定文件时,此函数 总是 返回 false。

另请参阅

lock() unlock()

unlock()#

通过删除锁文件来释放锁。

在没有先锁定文件的情况下调用 unlock() 将没有任何作用。

另请参阅

lock() tryLock()