Python 芹菜工作者自省以获取主机名/节点名

Python 芹菜工作者自省以获取主机名/节点名,python,django,celery,Python,Django,Celery,我想为我的Django 1.8应用程序运行py.test集成测试 一个完整的芹菜3.1设置,也就是说,有一个真正的队列(不是芹菜总是渴望) 为此,我需要说服工作人员使用基于服务器的测试数据库(PostgreSQL),而不是标准配置的数据库(SQlite3,它不能与第二个进程对话) 为此,我只想在首次使用数据库之前修改worker进程中的。(我想为其他py.test测试保留SQlite,并为交互测试保留正常的非测试DB。) 要做到这一点,工作者需要认识到它是在测试模式下运行,而不是在“正常”模式下

我想为我的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
)的并发配置:

  • 芹菜.exe(我在Windows上)
  • 工人本身,以及
  • 单工流程(对我来说是相关的)
  • 这是正确的吗

    芹菜发送到每个进程的方式似乎有所不同:

  • celeryd_init
    被发送到
    celery.exe
  • worker\u init
    被发送到worker
  • worker\u process\u init
    被发送到worker进程
  • 这也对吗

    我在Django应用程序中向芹菜.py添加了以下内容:

    导入芹菜.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.