- class QLockFile#
使用文件提供的类《a class="reference internal" href="#PySide6.QtCore.QLockFile" title="PySide6.QtCore.QLockFile">
QLockFile
提供进程间的锁定。更多…概述#
方法#
def
__init__()
def
error()
def
fileName()
def
getLockInfo()
def
isLocked()
def
lock()
def
staleLockTime()
def
tryLock()
def
unlock()
注释
本文档可能包含从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
的锁文件。返回锁文件错误状态。
如果
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()#
- 返回类型:
bool
创建锁文件。
如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将阻塞,直到该进程(或线程)释放它。
不允许从同一线程在同一锁上多次调用此函数而没有先解锁。如果文件递归锁定,则此函数将 死锁。
如果成功获取锁,则返回
true
,如果由于不可恢复的错误(例如父目录没有权限)无法获取锁,则返回false
。- 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()#
- 返回类型:
int
返回锁文件被认为是过期的毫秒数。
另请参阅
- tryLock(timeout)#
- 参数:
timeout – int
- 返回类型:
bool
尝试创建锁文件。此函数返回
true
,如果成功获得锁;否则返回false
。如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将等待最多timeout
毫秒,直到锁文件可用。注意:将负数传递给
timeout
等同于调用lock()
,即如果timeout
为负,则此函数将无限期等待直到锁文件可以被锁定。获取锁后,必须使用
unlock()
释放,否则另一个进程(或线程)无法成功锁定它。不允许从同一线程多次调用此函数锁定同一个锁而不先释放,当尝试递归锁定文件时,此函数 总是 返回 false。
- unlock()#
通过删除锁文件来释放锁。
在没有先锁定文件的情况下调用 unlock() 将没有任何作用。