2010-03-28 6 views
4

Есть ли способ заблокировать критическую область, например, с синхронизацией Java в Django?Thread Synchronization in Django

+1

Во многих случаях выполнение чего-то вроде «синхронизированного» Java недостаточно для кода Django. Обычный сценарий в приложении Django - это не просто защита ресурса от * других потоков *, а от * любого кода, который будет пытаться использовать ресурс *. Во многих случаях сервер WSGI будет использовать несколько * процессов * для обслуживания запросов и, таким образом, вам необходимо предотвратить доступ не только других потоков * в одном процессе к ресурсу, но и всех * процессов *, которые могут попытаться получить к нему доступ. «synchronized» недостаточно хорош для этого, и решение Python, которое реплицирует то, что «синхронизировано», тоже не будет достаточно хорошим. – Louis

ответ

5

Вы можете использовать блокировки, чтобы убедиться, что только один поток получит доступ к определенному блоку кода за раз.

Для этого вы просто создаете объект блокировки, затем приобретаете блокировку перед блоком кода, который хотите синхронизировать. Пример:

lock = Lock() 

lock.acquire() # will block if another thread has lock 
try: 
    ... use lock 
finally: 
    lock.release() 

Для получения дополнительной информации см http://effbot.org/zone/thread-synchronization.htm.

+0

Как Луис прокомментировал вопрос, это будет работать только в том случае, если есть один серверный процесс, что часто бывает не так. – RexE

0

Большая статья Джастин, только одна вещь, с помощью Python 2.5 делает этот способ проще

В Python 2.5 и более поздних, вы можете также использовать с заявлением. При использовании с замком, этот оператор автоматически получает блокировку перед входом в блок, и выпускает его при выходе из блока:

из будущего импорта with_statement # 2,5 только

с замком: ... доступ общий ресурс