Я хочу запустить тесты интеграции py.test для моего приложения Django 1.8 с полной установкой Celery 3.1, то есть с реальной очередью (не CELERY_ALWAYS_EAGER).Интроспекция работника сельдерея для получения имени хоста/nodename
Для этого мне нужно убедить рабочего использовать мою тестовую базу данных на сервере (PostgreSQL), а не стандартную конфигурацию DB (SQlite3, которая не может разговаривать со вторым процессом).
Для этого я хочу просто изменить DATABASES setting в рабочем процессе до того, как база данных будет впервые использована. (Я хочу сохранить SQlite для других тестов py.test, а также для обычной нетестовой БД для интерактивного тестирования.)
Для этого работник должен признать, что он работает в тестовом режиме, в отличие от 'нормальный режим. Для индикации режима тестирования, я начинаю рабочий с различными именами узлов:
celery worker -A myapp --concurrency=1 -n myworker --loglevel=info
для нормального режима по сравнению с
celery worker -A myapp --concurrency=1 -n mytestworker --loglevel=info
для режима испытаний.
Вопрос: Как модуль celery.py в моем приложении Django может читать вне имя_узла (имя хоста, заданное параметром -n
) работника?
Там, как представляется, три процесса, участвующих (я не имею никакой дальнейшей конфигурации параллелизма за выше =1
):
celery.exe
(я на Windows),- работник сам, и
- рабочий процесс (что для меня актуально).
Это правильно?
Там, как представляется, отличается signals, что сельдерей посылает каждому процессу:
celeryd_init
отправляетсяcelery.exe
,worker_init
отправляется на работника,worker_process_init
отправляется на рабочий процесс
Правильно ли это?
Я добавил следующее celery.py
в моем приложении Django:
import celery.signals
def init_here(signal, sender):
print("call %s(sender=%s)" % (signal, sender))
@celery.signals.celeryd_init.connect
def celeryd_init(sender, instance, **kwargs):
init_here("celeryd_init", sender)
@celery.signals.worker_init.connect
def worker_init(sender, **kwargs):
init_here("worker_init", sender)
@celery.signals.worker_process_init.connect
def worker_process_init(sender, **kwargs):
init_here("worker_process_init", sender)
Когда я начинаю рабочий в тестовом режиме, как указано выше, я получаю следующий результат (среди прочего):
call celeryd_init([email protected])
call worker_init([email protected])
[2015-09-30 15:53:23,767: WARNING/MainProcess] [email protected] ready.
[2015-09-30 15:53:24,282: WARNING/Worker-1] call worker_process_init(sender=None)
Слишком плохо! Соответствующий процесс Worker-1
не получает соответствующей информации [email protected]
. Как получить имя хоста?
Моя выше проблема действительно (как предложено @Louis), которую лучше всего разрешить переменной окружения. Тем не менее, я все равно хотел бы узнать ответ на вопрос, как его задали. –