Я реализую механизм взаимного исключения, основанный на блокировке файлов. Другие экземпляры моего скрипта знают, что они не должны запускаться, когда они поступают через определенный файл, который заблокирован.Как удалить заблокированный (стадо) файл без условия гонки: до или после освобождения блокировки?
Для этого я создал и заблокировал файл, используя fcntl.flock
. Когда я освобождаю блокировку, я также хочу очистить файл, чтобы он не сидел там, указав старый pid, когда процесс не запущен.
Мой вопрос в том, когда и как следует очищать файл, особенно в какой момент я могу его удалить. В основном я вижу два варианта:
- обрезать и удалить файл до снятия блокировки
- обрезать и удалить файл после снятия блокировки
Из моего понимания, каждый из которых раскрывает мое приложение в несколько разных условиях гонки. Что такое лучшая практика, что я пропустил?
Вот (чрезмерно упрощенный) Пример:
import fcntl
import os
import sys
import time
# open file for read/write, create if necessary
with open('my_lock_file.pid', 'a+') as f:
# acquire lock, raises exception if lock is hold by another process
try:
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print 'other process running:', f.readline()
sys.exit()
try:
# do something
f.write('%d\n' % os.getpid())
f.flush()
# more stuff here ...
time.sleep(5)
finally:
# clean up here?
# release lock
fcntl.flock(f, fcntl.LOCK_UN)
# clean up here?
# clean up here?
Также очень актуальной информации: HTTP: // stacko verflow.com/q/17708885/1025391 – moooeeeep