Python 芹菜工作者自省以获取主机名/节点名
我想为我的Django 1.8应用程序运行py.test集成测试 一个完整的芹菜3.1设置,也就是说,有一个真正的队列(不是芹菜总是渴望) 为此,我需要说服工作人员使用基于服务器的测试数据库(PostgreSQL),而不是标准配置的数据库(SQlite3,它不能与第二个进程对话) 为此,我只想在首次使用数据库之前修改worker进程中的。(我想为其他py.test测试保留SQlite,并为交互测试保留正常的非测试DB。) 要做到这一点,工作者需要认识到它是在测试模式下运行,而不是在“正常”模式下运行。 为了指示测试模式,我使用不同的节点名称启动工作进程:Python 芹菜工作者自省以获取主机名/节点名,python,django,celery,Python,Django,Celery,我想为我的Django 1.8应用程序运行py.test集成测试 一个完整的芹菜3.1设置,也就是说,有一个真正的队列(不是芹菜总是渴望) 为此,我需要说服工作人员使用基于服务器的测试数据库(PostgreSQL),而不是标准配置的数据库(SQlite3,它不能与第二个进程对话) 为此,我只想在首次使用数据库之前修改worker进程中的。(我想为其他py.test测试保留SQlite,并为交互测试保留正常的非测试DB。) 要做到这一点,工作者需要认识到它是在测试模式下运行,而不是在“正常”模式下
celery worker -A myapp --concurrency=1 -n myworker --loglevel=info
对于正常模式与
celery worker -A myapp --concurrency=1 -n mytestworker --loglevel=info
用于测试模式
问题:Django应用程序中的芹菜.py模块如何读取
是否删除工作进程的节点名(主机名,由-n
选项设置)
似乎涉及三个过程(我没有进一步的说明)
超出上述=1
)的并发配置:
celeryd_init
被发送到celery.exe
worker\u init
被发送到workerworker\u process\u init
被发送到worker进程导入芹菜.signals
def init_在此(信号、发送器):
打印(“呼叫%s(发件人=%s)”%(信号,发件人))
@celery.signals.celeryd_init.connect
def celeryd_init(发送方,实例,**kwargs):
init_here(“celeryd_init”,发送方)
@芹菜.signals.worker_init.connect
def worker_init(发送方,**kwargs):
init_here(“worker_init”,发送方)
@celery.signals.worker\u process\u init.connect
def工作进程初始化(发送方,**kwargs):
init_here(“worker_process_init”,发送方)
当我在如上所述的测试模式下启动worker时,我得到以下输出(以及其他输出):
太糟糕了!相关流程Worker-1
未收到相关信息celery@mytestworker
。
它如何获得主机名?即使您可以让它工作,我也不建议使用工作程序名称来检测您是否处于测试模式。这将是一次黑客攻击 我解决代码是否在测试模式下运行的问题的方法是使用一个名为
proj/test\u settings.py
(而“常规”文件位于proj/settings.py
),其中proj
是我的项目名称(与下面的proj
相同)。我让它创建一个确定我们是否处于测试模式的设置:
from .settings import *
PROJ_TESTING = True
此变量仅通过test\u设置
文件设置为true。请注意,在此test\u settings.py
文件中也可以有一些行覆盖settings.py
中设置的默认值。例如,我确实有更改数据库配置和日志记录的代码
我安排启动测试的代码来设置环境变量DJANGO\u SETTINGS\u MODULE=proj.test\u SETTINGS
。由于测试中使用的my Cellery workers是由运行我的测试的代码启动的,因此他们正在加载测试设置并使用PROJ_testing
true运行。因此,如果需要检查测试模式,我可以执行以下操作:
from django.conf import settings
if settings.PROJ_TESTING:
# Do what we need when we are testing.
else:
# Do something else.
这种方法反映了我们如何通过将debug
设置设置为True
来设置调试模式。我的上述问题确实(正如@Louis所建议的)最好通过环境变量来解决。不过,我仍然想知道问题的答案。
from django.conf import settings
if settings.PROJ_TESTING:
# Do what we need when we are testing.
else:
# Do something else.