我用python编写了两个脚本,它们将处理同一目录中的数据。一个脚本将设置为每5分钟运行一次,并将数据保存到目录中,然后每天一次,另一个脚本将压缩所有数据,将其存档并删除原始文件。为了避免归档脚本删除可能由工作脚本保存的文件,我想创建一个系统范围的互斥锁,以使工作脚本知道在存档器执行其操作时不运行。
我进行了一些搜索,发现在基于UNIX的系统上,通常被接受的方法是尝试锁定文件。如果得到的锁那么大,请继续运行,如果找不到,则说明其他进程已在运行。我编写了以下代码:
import fcntl
import traceback
class ProcessLock:
def __init__(self, path_to_file, block):
self.file_path = path_to_file
try:
options = fcntl.LOCK_EX
if not block:
options = options | fcntl.LOCK_NB
self.file = open(path_to_file, 'w+')
self.lock = fcntl.flock(file, options)
except:
print 'caught something: {}'.format(traceback.format_exc())
self.file = None
self.lock = None
def is_locked(self):
return self.lock is not None
def unlock(self):
self.lock = None
self.file = None
def aquire_lock(lock_name):
path = '/tmp/{}.lock'.format(lock_name)
return ProcessLock(path, False)
def aquire_lock_blocking(lock_name):
path = '/tmp/{}.lock'.format(lock_name)
return ProcessLock(path, True)
但是对于我的一生,我无法使其真正发挥作用。我进行了搜索,发现的所有示例以及此处发布的其他问题似乎都可以使用我获得的代码来工作。我也尝试过flock
和lockf
,但都没有用。对open
的调用正常工作,但我将以下内容注销到控制台:
self.lock = fcntl.flock(file, options)
TypeError: descriptor 'fileno' of 'file' object needs an argument
我对Python不够了解,无法知道此错误的含义。希望有人可以看看我做错了什么。我正在macOS的Pycharm中运行它