Есть ли способ заблокировать критическую область, например, с синхронизацией Java в Django?Thread Synchronization in Django
ответ
Вы можете использовать блокировки, чтобы убедиться, что только один поток получит доступ к определенному блоку кода за раз.
Для этого вы просто создаете объект блокировки, затем приобретаете блокировку перед блоком кода, который хотите синхронизировать. Пример:
lock = Lock()
lock.acquire() # will block if another thread has lock
try:
... use lock
finally:
lock.release()
Для получения дополнительной информации см http://effbot.org/zone/thread-synchronization.htm.
Как Луис прокомментировал вопрос, это будет работать только в том случае, если есть один серверный процесс, что часто бывает не так. – RexE
Большая статья Джастин, только одна вещь, с помощью Python 2.5 делает этот способ проще
В Python 2.5 и более поздних, вы можете также использовать с заявлением. При использовании с замком, этот оператор автоматически получает блокировку перед входом в блок, и выпускает его при выходе из блока:
из будущего импорта with_statement # 2,5 только
с замком: ... доступ общий ресурс
Во многих случаях выполнение чего-то вроде «синхронизированного» Java недостаточно для кода Django. Обычный сценарий в приложении Django - это не просто защита ресурса от * других потоков *, а от * любого кода, который будет пытаться использовать ресурс *. Во многих случаях сервер WSGI будет использовать несколько * процессов * для обслуживания запросов и, таким образом, вам необходимо предотвратить доступ не только других потоков * в одном процессе к ресурсу, но и всех * процессов *, которые могут попытаться получить к нему доступ. «synchronized» недостаточно хорош для этого, и решение Python, которое реплицирует то, что «синхронизировано», тоже не будет достаточно хорошим. – Louis