2012-02-03 3 views
1

У меня есть проект django с различными приложениями, которые полностью независимы. Я бы хотел, чтобы они запускали каждый из них в своем собственном процессе, так как некоторые из них порождают фоновые потоки, чтобы периодически вычислять некоторые данные, и теперь они конкурируют за процессор (машина имеет множество ядер, но вы знаете, GIL и такие ...)Разбивка проекта Django

Итак, есть ли простой способ разделить проект на разные или, по крайней мере, сделать каждое приложение живым в своем собственном процессе?

ответ

4

У вас всегда могут быть разные файлы настроек, но это будет похоже на несколько проектов и даже несколько конечных точек. С некоторыми усилиями вы можете настроить обратный прокси-сервер для пересылки на правый сервер Django на основе пути запроса и так далее, но я не думаю, что это то, что вы хотите, и это было бы уродливым решением вашей проблемы.

Решение этого - переместить тяжелую обработку в очередь заданий. Для этого много людей и проектов предпочитают Celery.

Если по какой-то причине кажется излишним, вы всегда можете реализовать свои собственные, основываясь на простых заданиях cron. Вы можете взглянуть на my small project, который делает это.

+0

Сельдерей был вариантом, который я натолкнулся на поиски решения моей проблемы, я думаю, что, возможно, стоит заглянуть в него :-) – fortran

1

Простейшим из простых является, вероятно, написать custom management command, который наблюдает за данной моделью (таблицей базы данных) за новые записи и обрабатывает их. Модель записывается, например, Просмотр Django и команда управления запускаются периодически из cron (например, каждые 5 минут).

Пример: пользовательские регистры на сайте, но создание учетной записи является дорогостоящей операцией (выделение пространства, проверка удаленных служб и т. Д.). Поэтому вы просто записываете новую запись в таблицу AccountRequest (AccountRequest.objects.create(...)). Затем cron периодически запускает ваш сценарий управления (./manage.py account_creator), который проверяет наличие нового AccountRequest-s (AccountRequest.objects.filter(unprocessed=True)), выполняет свою работу и маркирует эти запросы как обработанные.

+0

Это работает, и я тоже делал это так, но вы можете столкнуться с проблемами, потому что условия гонки могут произойти, поэтому я предпочитаю более общее решение, которое имеет этот маленький подвиг. –

+0

@Alexandru: Какое состояние гонки вы имеете в виду? –

+1

Tomasz, фоновые задания по определению медленные и непредсказуемые, а cron.d не заботятся об этом. В какой-то момент я оказался в ситуации, когда начальный процесс начался слишком медленно, чтобы завершить выделенные X минут, поэтому cron продолжал запускать процессы, что в конечном итоге привело к остановке моего сервера :-) ... это, а также возможность иметь 2 процесса, которые обрабатывают одни и те же данные, которые затем открывают другую банку червей. Поэтому необходимо принять меры для обеспечения того, чтобы эти две вещи не случались. –