2016-05-13 4 views
3

В моих задачах для сельдерея у меня есть задача, которая использует модуль python (theano), который выполняется на GPU, этот модуль может быть импортирован только одним потоком одновременно. Но, чтобы начать веб-сайт, я должен работать:Как отделить Django и сельдерей?

python manage.py runserver 
celery -A celery_try worker -l info 

Так модуль будет импортирован как сельдерей и Джанго веб-сайт, который является конфликт. Есть ли способ разделить Django и Celery так, чтобы модуль импортировался только один раз?

+0

Я не уверен, почему запуск обоих процессов означает, что вам нужно импортировать модуль в обоих. Если вы не хотите импортировать его в один из них, просто не делайте этого. –

+0

В представлении Django я импортирую задачи, поэтому сервер Django импортирует те же модули tasks.py import, в то время как сельдерей импортирует любые задачи. Также импортирует импорт, так как оба процесса импортируют модуль. – Demonedge

+0

сам по себе сельдерей работает вне django! это то, как вы его инициализируете, например. если ваш модуль загружает все стеки django и все ваши приложения django – Jerzyk

ответ

0

В целях тестирования вы можете запустить сервер разработки django в однопоточном режиме: python manage.py runserver --nothreading.

Вы хотите import theano только в процессе работы сельдерея, а не в процессе веб-сервера django, правильно? Хорошо, давайте сделаем импорт условным, чтобы он был импортирован в сельдерей, а не в джанго.

import os 

try: 
    # next line will raise exception in django, but will work fine in celery 
    is_worker = os.environ['celery_worker'] 
    import theano # celery will import theano, django won't 
except Exception as exc: 
    # django code will catch exception that celery_worker doesn't exist and print it here 
    print exc 

И начать сельдерей работник с переменной celery_worker среды набором:

celery_worker=yes celery -A celery_try worker -l info 

различать сельдерея работник и Джанго, давайте установить переменную Баш среду в процессе сельдерея, но не в процессе Джанго. Я назвал эту переменную celery_worker. Чтобы установить его, я добавил celery -A celery_try worker -l info с per-command env variable assignment: celery_worker=yes. Теперь, в коде python, я проверяю, присутствует ли переменная среды. Если это так, мы работаем с сельдереем и должны импортировать анано.

Если мы находимся в django, os.environ['celery_worker'] не должен определяться и должен возбуждать исключение.

+0

'python manage.py runningerver --nothreading' не работает, я все равно получаю то же сообщение об ошибке , И я не совсем понимаю ваше решение для развязки, не могли бы вы объяснить больше? Благодарю. – Demonedge

+0

@Demonedge Вы хотите «импортировать theano» только в процессе работы с сельдерием, а не в процессе веб-сервера django, правильно? Хорошо, давайте сделаем импорт условным, чтобы он был импортирован в сельдерей, а не в джанго. Чтобы различить работника сельдерея и джанго, давайте установим переменную среды bash в процессе сельдерея, но не в процессе django. Я назвал эту переменную 'celery_worker'. Чтобы установить его, я добавил 'celery -A celery_try worker -l info' с назначением переменной env per-command:' celery_worker = yes'. Теперь, в коде python, я проверяю, присутствует ли переменная среды и если она импортирует theano. –

+0

Проблема в том, что я не могу выбрать не импортировать Theano. Когда я запускаю сервер, view.py автоматически импортирует задачи из Сельдерея, который будет импортировать Theano. Когда я запускаю работу Celery для обработки задачи, снова Celery импортирует tasks.py, который снова импортирует Theano. – Demonedge

Смежные вопросы