Portalocker не выходит как ожидалось, тогда как fcntl - PullRequest
0 голосов
/ 26 апреля 2019

Я не понимаю, почему 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

...