Я не понимаю, почему portalocker не выходит из строя изящно с сообщением "есть файл блокировки". Вместо этого происходит сбой со следующей ошибкой:
portalocker.exceptions.LockException: [Errno 11] Resource temporarily unavailable
Обратите внимание, что вопрос уже задан, но никто не ответил убедительно. см python-lock-a-file
Вот проблемный скрипт, который должен быть запущен на двух разных консолях.
#!/usr/bin/python3
import portalocker
import sys
def open_and_lock(full_filename):
file_handle = open(full_filename, 'w')
try:
portalocker.lock(file_handle, portalocker.LOCK_EX | portalocker.LOCK_NB)
return file_handle
except IOError:
print ("there is a lockfile")
sys.exit(-1)
# positioning a lock
lock_name = 'my_lock'
fh = open_and_lock(lock_name)
# do something consumer in time
i = 0
while (i < 100000000):
i += 1
print ("i :", i)
# lock release
close(fh)
Замените portalocker на fcntl и ... все работает отлично!
#!/usr/bin/python3
import fcntl
import sys
def open_and_lock(full_filename):
file_handle = open(full_filename, 'w')
try:
fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB)
return file_handle
except IOError:
print ("there is a lockfile")
sys.exit(-1)
# positioning a lock
lock_name = 'my_lock'
fh = open_and_lock(lock_name)
# do something consumer in time
i = 0
while (i < 100000000):
i += 1
print ("i :", i)
# lock release
close(fh)
Что происходит? почему такая разница в поведении между portalocker и fcntl?
пс:
Python 3.6.7
Ubuntu 18.04