Асинхронная обработка демона / взаимодействие ORM с Django - PullRequest
0 голосов
/ 10 мая 2010

Я ищу способ асинхронной обработки данных с помощью демона, использующего Django ORM. Однако ORM не является потокобезопасным; Это не безопасно для потоков, чтобы попытаться получить / изменить объекты Django из потоков. Поэтому мне интересно, каков правильный способ достижения асинхронности?

По сути, мне нужно взять список пользователей в БД, запросить API стороннего производителя и затем обновить строки профиля пользователя для этих пользователей. Как демон или фоновый процесс. Делать это последовательно для каждого пользователя легко, но для масштабирования требуется слишком много времени. Если демон извлекает и обновляет пользователей через ORM, как мне обрабатывать 10-20 пользователей одновременно? Я бы использовал для этого стандартную систему потоков / очередей, но вы не можете использовать такие потоки, как

models.User.objects.get(id=foo) ...

Django сам по себе является асинхронной системой обработки, которая выполняет асинхронные вызовы ORM (?) Для каждого запроса, поэтому должен быть способ сделать это? Я ничего не нашел в документации до сих пор.

Приветствия

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

Взгляните на сельдерей . Я думаю, что это решит вашу проблему. Используется многопроцессорный модуль. Это требует (очень) небольшой настройки, однако очень помогает в масштабировании.

2 голосов
/ 11 мая 2010

Если ваша асинхронная обработка выполняется в своем собственном процессе, тогда безопасность потоков не является проблемой, поскольку ваши потоки не разделяют адресное пространство, поэтому они не могут мешать друг другу. Каждый из них будет иметь свою собственную копию объектов модели. Параллельность будет контролироваться базой данных с транзакциями. Так что ваш штраф.

Если вы собираетесь создавать поток внутри одного из процессов веб-сервера для выполнения асинхронного бизнеса, вам необходимо заблокировать все вызовы API, которые не являются потокобезопасными.

from threading import Lock

Apache использует несколько процессов через системный вызов fork () для обработки одновременных веб-запросов. Вот почему API-интерфейсы Django ORM не должны быть поточно-ориентированными. Я полагаю, что Apache может использовать потоки вместо процессов, но считает, что для использования Django эту функцию необходимо отключить.

http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95

Кстати, вы понимаете разницу между потоком и процессом? Это важно.

...