【发布时间】:2015-09-30 14:05:07
【问题描述】:
我想为我的 Django 1.8 应用程序运行 py.test 集成测试 完整的 Celery 3.1 设置,即具有真实队列(不是 CELERY_ALWAYS_EAGER)。
为此,我需要说服工作人员使用我的基于服务器的测试数据库 (PostgreSQL) 而不是标准配置的数据库(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
用于测试模式。
问题:我的 Django 应用程序中的 celery.py 模块如何读取
取出 worker 的节点名(主机名,使用 -n 选项设置)?
似乎涉及三个过程(我没有进一步的
上面的并发配置=1):
-
celery.exe(我在 Windows 上), - worker 本身,以及
- 单个工作进程(这对我来说是相关的)。
这对吗?
celery 向每个进程发送的signals 似乎不同:
-
celeryd_init发送到celery.exe, -
worker_init发送给worker, -
worker_process_init被发送到工作进程
这也是正确的吗?
我在我的 Django 应用程序中将以下内容添加到 celery.py:
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(sender=celery@mytestworker)
call worker_init(sender=celery@mytestworker)
[2015-09-30 15:53:23,767: WARNING/MainProcess] celery@mytestworker ready.
[2015-09-30 15:53:24,282: WARNING/Worker-1] call worker_process_init(sender=None)
太糟糕了!相关进程Worker-1没有收到相关信息celery@mytestworker。
如何获取主机名?
【问题讨论】:
-
我的上述问题确实(如@Louis 所建议)最好由环境变量解决。但是,我仍然想知道所问问题的答案。