Я закончил тем, что нашел решение, основанное на блокировке файлов. Если кто-то здесь использует его, помните, что консультативные блокировки и NFS плохо сочетаются, поэтому держите его локально. Кроме того, это блокирующая блокировка, если вы хотите возиться с циклами и постоянно возвращаться, то в коде есть инструкции.
import os
import fcntl
class DjangoLock:
def __init__(self, filename):
self.filename = filename
# This will create it if it does not exist already
self.handle = open(filename, 'w')
# flock() is a blocking call unless it is bitwise ORed with LOCK_NB to avoid blocking
# on lock acquisition. This blocking is what I use to provide atomicity across forked
# Django processes since native python locks and semaphores only work at the thread level
def acquire(self):
fcntl.flock(self.handle, fcntl.LOCK_EX)
def release(self):
fcntl.flock(self.handle, fcntl.LOCK_UN)
def __del__(self):
self.handle.close()
Usage:
lock = DJangoLock('/tmp/djangolock.tmp')
lock.acquire()
try:
pass
finally:
lock.release()