Итак, я хочу выполнить некоторый код, который должен быть атомарным из разных запущенных программ на Python. Для этого я подумал об использовании файловых блокировок.
Однако, это не работает. В следующем коде я распечатываю сообщение, указанное в качестве аргумента, и затем подождите 30 секунд, прежде чем разблокировать файл. В этом случае, если я запускаю два экземпляра, второй экземпляр должен будет ждать этого времени, чтобы напечатать сообщение. Но это не то, что происходит, так как оба экземпляра немедленно печатают сообщение.
Какую ошибку я делаю?
message = sys.argv[1]
lock_file = "test.lock"
_flock = None
def _lock_file():
_flock = open(lock_file, 'w+')
while True:
try:
fcntl.flock(_flock, fcntl.LOCK_EX | fcntl.LOCK_NB)
break
except IOError as e:
# raise on unrelated IOErrors
if e.errno != errno.EAGAIN:
raise
else:
time.sleep(0.1)
def _unlock_file():
if _flock != None:
fcntl.flock(_flock, fcntl.LOCK_UN)
_lock_file()
print(message)
time.sleep(30)
_unlock_file()