Я написал два скрипта на Python, которые будут работать с данными в одном каталоге.Один сценарий будет настроен на запуск каждые 5 минут и будет сохранять данные в каталоге, а затем один раз в день другой сценарий будет архивировать все эти данные, архивировать их и удалять исходные файлы.Чтобы избежать удаления сценариями архивирования файлов, которые могут быть сохранены рабочим сценарием, я хочу создать общесистемный мьютекс, чтобы рабочий сценарий знал, что он не запускается, пока архиватор делает свое дело.
IМы провели некоторый поиск и увидели, что в системах на основе 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, чтобы понять, что означает эта ошибка.Надеюсь, кто-нибудь увидит, что я делаю что-то не так.Я запускаю это в Pycharm на MacOS