В ОС на основе Debian (Ubuntu, Debian Squeeze) я использую fttnt(), чтобы заблокировать файл. Как я понимаю из того, что я читал, fnctl.flock блокирует файл таким образом, что будет вызываться исключение, если другой клиент хочет заблокировать один и тот же файл.
Я построил небольшой пример, который я бы ожидал, чтобы выбросить excepiton, поскольку я сначала заблокировал файл, а затем, сразу после этого, я снова попытаюсь заблокировать его:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX)
try:
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print("can't immediately write-lock the file ($!), blocking ...")
else:
print("No error")
Но пример просто печатает "Без ошибок".
Если я разорву этот код до двух клиентов, работающих одновременно (одна блокировка, а затем ожидание, другая попытка блокировки после первой блокировки уже активна), я получаю такое же поведение - никакого эффекта вообще.
Какое объяснение этого поведения?
ИЗМЕНИТЬ
Изменяется по требованию ночного скребка, эта версия также выводит "Нет ошибки", хотя я не ожидал бы этого:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
import time
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
try:
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print("can't immediately write-lock the file ($!), blocking ...")
else:
print("No error")