Lock bloquant avec twisted

darcs-hash:20041205173658-d1718-5d474a458f946e96b7f2e3513a8b1ff6cbb0dd3f.gz
This commit is contained in:
bernat 2004-12-05 18:36:58 +01:00
parent e91111b425
commit a4c0d7975d

View file

@ -13,6 +13,29 @@ from user_tests import getuser
from fcntl import lockf, LOCK_EX, LOCK_NB, LOCK_UN from fcntl import lockf, LOCK_EX, LOCK_NB, LOCK_UN
import errno import errno
def wait_lock(lock_name, lock_comment='', d=None):
"""Attend la disponibilité d'un lock en utilisant le framework Twisted.
Si d est de type Deferred, on est en mode asynchrone.
"""
from twisted.internet import reactor, defer
try:
make_lock(lock_name, lock_comment, quiet=True)
# On a le lock
if not d:
# On est en mode synchrone
return defer.succeed(None)
# On appelle le callback car on est en mode asynchrone
d.callback()
except AssertionError:
# On a pas le lock
if not d:
# On est en mode synchrone, on va passer en asynchrone
d = defer.Deferred()
# On essaie de nouveau dans 200 ms.
reactor.callLater(0.2, wait_lock, lock_name, lock_comment, d)
return d
def make_lock(lock_name, lock_comment='',nowait=1, quiet=False) : def make_lock(lock_name, lock_comment='',nowait=1, quiet=False) :
""" Création d'un lock """ Création d'un lock
si nowait=1 fait un sys.exit(254) quand un ancien lock actif est rencontré si nowait=1 fait un sys.exit(254) quand un ancien lock actif est rencontré