Я работал в такой ситуации, когда я запускаю несколько копий одной и той же программы из одной и той же директории / папки и регистрирую ошибки. Мой подход состоял в том, чтобы записать «файл блокировки» на диск перед открытием файла журнала. Программа проверяет наличие "файла блокировки", прежде чем продолжить, и ждет его очереди, если "файл блокировки" существует.
Вот код:
def errlogger(error):
while True:
if not exists('errloglock'):
lock = open('errloglock', 'w')
if exists('errorlog'): log = open('errorlog', 'a')
else: log = open('errorlog', 'w')
log.write(str(datetime.utcnow())[0:-7] + ' ' + error + '\n')
log.close()
remove('errloglock')
return
else:
check = stat('errloglock')
if time() - check.st_ctime > 0.01: remove('errloglock')
print('waiting my turn')
EDIT ---
Подумав над комментариями о устаревших блокировках, приведенных выше, я отредактировал код, добавив проверку на устаревание «файла блокировки». Время выполнения нескольких тысяч итераций этой функции в моей системе составило, в среднем, 0,002066 ... секунд по сравнению с предыдущим:
lock = open('errloglock', 'w')
только после:
remove('errloglock')
поэтому я подумал, что начну с пятикратного увеличения этой суммы, чтобы указать на устаревание и отслеживать ситуацию на предмет проблем.
Кроме того, когда я работал с синхронизацией, я понял, что у меня есть немного кода, который на самом деле не нужен:
lock.close()
, который у меня был сразу после оператора open, поэтому я удалил его в этом редакторе.