Мой подход заключается в использовании функций блокировки базы данных. Это также работает с несколькими серверными процессами.
Я определяю модель как:
from django.db import models
class ThreadSafe(models.Model):
key = m.CharField(max_length=80, unique=True)
А затем функция менеджера контекста:
from contextlib import contextmanager
from django.db.transaction import atomic
@contextmanager
def lock(key):
pk = ThreadSafe.objects.get_or_create(key=key)[0].pk
try:
objs = ThreadSafe.objects.filter(pk=pk).select_for_update()
with atomic():
list(objs)
yield None
finally:
pass
А затем я могу заблокировать поток / процесс, просто выполнив:
with lock("my_key"):
do_scary_stuff_here()
Для этого требуется база данных с поддержкой транзакций.