临沂网站建设推广,网站要怎么样做排名才上得去,网站推广服务网站连锁,思途旅游网站建设系统多个进程共享同一份资源#xff08;共享内存、文件等#xff09;时#xff0c;会涉及到资源竞争问题。为了解决这种问题#xff0c;一般采取的措施是进程在访问资源前加锁保护#xff0c;避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。 目录…多个进程共享同一份资源共享内存、文件等时会涉及到资源竞争问题。为了解决这种问题一般采取的措施是进程在访问资源前加锁保护避免多个进程同时读写。本文介绍的Python文件锁可以用来解决多进程的同步问题。
目录1 Linux下的Python文件锁2 Windows下的Python文件锁3 总结3.1 filelock的使用场景进程一进程二1 Linux下的Python文件锁
Linux下使用文件锁用到了fcntl模块该模块是标准库用来对文件描述符执行文件控制和I/O控制。 fcntl的文件锁用到了fcntl.flock(fd, operation)方法它的官方说明如下 对文件描述符fd执行锁定操作。 如果flock失败将引发OSError异常。 参数含义 fd要锁定的文件的描述符。 operation操作类型有以下三种。
类型描述LOCK_UN解锁LOCK_SH获取共享锁所有进程都只能读不能写LOCK_EX获取独占锁只有当前进程可以读写LOCK_NB非阻塞加锁失败或成功都立即返回如果不加这个参数函数会一直阻塞直到拿到锁。
用法
def tryLock(f) :try :fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)return Trueexcept Exception as e:return Falsedef tryUnLock(f) :try :fcntl.flock(f, fcntl.LOCK_UN)return Trueexcept Exception as e:return Falsef open(file.txt, w)
if tryLock(f) True:f.write(1234)tryUnLock(f)flock函数在执行失败时会抛出异常所以要用try-except来捕捉避免flock的时候程序退出。 fcntl模块支持在独占模式下写文件。
2 Windows下的Python文件锁
Windows版本的Python没有提供fcntl模块它使用文件锁时使用的是filelock模块需要自己安装。 打开命令行安装。
pip install filelock虽然没找到filelock的官方文档但可以通过dir函数来看它有些什么方法。
import filelock
print(dir(filelock))输出。
[AcquireReturnProxy, BaseFileLock, FileLock, SoftFileLock,
Timeout, UnixFileLock, WindowsFileLock, _FileLock, __all__,
__annotations__, __builtins__, __cached__, __doc__, __file__,
__loader__, __name__, __package__, __path__, __spec__,
__version__, _api, _error, _soft, _unix, _util, _windows,
annotations, has_fcntl, sys, version, warnings]Python里形如__xxx__的一般都是私有成员。 没有直接提供方法但从中能看到一个FileLock类和__path__路径打印一下。
import filelock
print(dir(filelock.FileLock))
print(filelock.__path__)输出。
[__abstractmethods__, __call__, __class__, __del__,
__delattr__, __dict__, __dir__, __doc__, __enter__,
__eq__, __exit__, __format__, __ge__, __getattribute__,
__gt__, __hash__, __init__, __init_subclass__, __le__,
__lt__, __module__, __ne__, __new__, __reduce__,
__reduce_ex__, __repr__, __setattr__, __sizeof__, __slots__,
__str__, __subclasshook__, __weakref__, _abc_impl, _acquire,
_recreate_cm, _release, acquire, is_locked, lock_file, release, timeout][D:\\xxx\\xxx\\xxx\\site-packages\\filelock]FileLock提供了acquire、is_locked、release、timeout。按照名称acquire和release是上锁和解锁的方法timeout是上锁的超时限制。 进入__path__所在目录用vscode的全局搜索分别找到FileLock、acquire、release、timeout。 用这种方法得到以下使用例程。
from filelock import FileLock
import timedef tryLock(locker, timeout 3):try:locker.acquire(timeout)return Trueexcept Exception as e:return Falsedef tryUnLock(locker):try:locker.release()return Trueexcept Exception as e:return Falselocker FileLock(file.txt)
if tryLock(locker, 0.1) True:time.sleep(5)tryUnLock(locker)filelock同样是通过抛出异常来表示上锁失败。 filelock模块在上锁状态下不允许写文件。 filelock支持在Linux环境下使用。
3 总结
在Linux环境下可以用fcntl或者filelock模块来实现文件锁功能而在Windows环境下只能用filelock。 fcntl和filelock上锁的区别
filelockfcntl可以设置阻塞超时时长可以设置阻塞和非阻塞没有超时机制上锁后不能访问文件在LOCK_EX 独占锁模式下当前进程可以读写文件需要自行安装Python自带的标准库
3.1 filelock的使用场景
filelock在上锁之后不能访问文件那么它有什么用呢 在应用中可以把filelock上锁的文件作为进程间同步的标志物比如以下例子 tryLock和tryUnLock使用的是第二节例程的。
进程一
locker FileLock(lock_file)
while True:if tryLock(locker) True:## operate1tryUnLock(locker)进程二
locker FileLock(lock_file)
while True:if tryLock(locker) True:## operate2tryUnLock(locker)以上两个进程同时运行可以确保操作互不干扰。