В операционной системе на базе Debian (Ubuntu, Debian Squeeze) я использую fttnt(), чтобы заблокировать файл. Как я понимаю из того, что я читал, fnctl.flock блокирует файл таким образом, что будет вызываться исключение, если другой клиент хочет заблокировать один и тот же файл.Python fcntl не заблокирован, как ожидалось
Я построил маленький пример, который я бы ожидать, чтобы бросить 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")
Но пример просто печатает «Нет ошибки».
Если я разделяю этот код на два клиента, работающих одновременно (одна блокировка, а затем ожидание, другая попытка блокировки после первой блокировки уже активна), я получаю такое же поведение - никакого эффекта вообще.
Какое объяснение этого поведения?
EDIT:
Изменения по просьбе nightcracker, эта версия также не печатает "Нет ошибки", хотя я бы не стал ожидать, что:
#!/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")
Существует [catch о блокировке файлов в рамках одного процесса] (http://0pointer.de/blog/projects/locking.html). Таким образом, в рамках одного процесса потоки будут совместно использовать блокировку файлов. – bouke