РЕДАКТИРОВАТЬ: Я решил это сам! Используя существование каталога & age в качестве механизма блокировки! Блокировка по файлу безопасна только в Windows (потому что Linux молча перезаписывает), но блокировка по каталогу отлично работает как в Linux, так и в Windows. Посмотрите мой GIT, где я создал простой в использовании класс 'lockbydir.DLock' для этого:
https://github.com/drandreaskrueger/lockbydir
В нижней части файла readme вы найдете 3 GIT-плеера, где вы можете увидеть примеры кода, исполняемые вживую в вашем браузере! Довольно круто, не правда ли? : -)
Спасибо за внимание
Это был мой оригинальный вопрос:
Я хотел бы ответить на parity3 (https://meta.stackoverflow.com/users/1454536/parity3), но я не могу ни комментировать напрямую («Вы должны иметь 50 репутацию, чтобы комментировать»), ни я не вижу способа связаться с ним / ней напрямую. вы предлагаете мне дозвониться до него?
Мой вопрос:
Я реализовал нечто похожее на то, что parity3 предложил здесь в качестве ответа: https://stackoverflow.com/a/21444311/3693375 («Предполагая, что ваш интерпретатор Python и ...»)
И это прекрасно работает - на Windows. (Я использую его для реализации механизма блокировки, который работает с независимо запущенными процессами. https://github.com/drandreaskrueger/lockbyfile)
Но, кроме четности 3, в Linux это НЕ работает:
os.rename (src, dst)
Переименуйте файл или каталог src в dst. ... в Unix, если dst существует
и это файл,
он будет заменен без уведомления, если у пользователя есть разрешение.
Операция может потерпеть неудачу на некоторых разновидностях Unix, если src и dst
находятся на разных файловых системах. В случае успеха, переименование будет
быть атомарной операцией (это требование POSIX).
В Windows, если dst уже существует, будет вызвано OSError
(https://docs.python.org/2/library/os.html#os.rename)
Проблема с тихой заменой. В линуксе
«Если dst уже существует, OSError будет поднят» отлично подходит для моих целей. Но только на Windows, к сожалению.
Полагаю, пример parity3 по-прежнему работает большую часть времени из-за его условия if
if not os.path.exists(lock_filename):
try:
os.rename(tmp_filename,lock_filename)
Но тогда все это уже не атомарно.
Потому что условие if может быть истинным в двух параллельных процессах, и тогда оба будут переименованы, но только один из них выиграет гонку переименования. И никаких исключений не возникло (в Linux).
Есть предложения? Спасибо!
П.С .: Я знаю, что это неправильный путь, но мне не хватает альтернативы. ПОЖАЛУЙСТА, не наказывайте меня понижением моей репутации. Я много смотрел вокруг, чтобы решить это сам. Как PM пользователи здесь? И ме почему я не могу?