gpt4 book ai didi

python - Celery worker 自省(introspection)以获取主机名/节点名

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:34 25 4
gpt4 key购买 nike

我想为我的 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 模块如何读取输出工作节点的节点名(主机名,使用 -n 选项设置)?

似乎涉及三个过程(我没有进一步的超出上述范围的并发配置 =1):

  1. celery.exe(我在 Windows 上),
  2. worker 本身,以及
  3. 单个工作进程(与我相关)。

这是正确的吗?

似乎有不同的 signals celery 发送到每个进程:

  1. celeryd_init 被发送到 celery.exe
  2. worker_init 被发送到worker
  3. 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相关信息。它如何获取主机名?

最佳答案

即使你可以让它工作,我也不建议使用工作人员名称来检测你是否处于测试模式。这将是一个黑客行为。

我解决了了解我的代码是否在测试模式下运行的问题的方法是使用一个名为 proj/test_settings.py 的不同设置文件(而“常规”设置文件位于 proj/settings.py),其中 proj 是我的项目名称(与下面的 PROJ 相同)。我让它创建一个设置来确定我们是否处于测试模式:

from .settings import *

PROJ_TESTING = True

此变量仅由 test_settings 文件设置为 true。请注意,此 test_settings.py 文件中还可以包含一些覆盖 settings.py 中设置的默认值的行。例如,我确实有更改数据库配置和日志记录的代码。

我安排了启动测试的代码来设置环境变量DJANGO_SETTINGS_MODULE=proj.test_settings。由于测试中使用的 celery 工作人员是由运行我的测试的代码启动的,因此他们正在加载测试设置并以 PROJ_TESTING true 运行。因此,如果需要检查测试模式,我可以这样做:

from django.conf import settings

if settings.PROJ_TESTING:
# Do what we need when we are testing.
else:
# Do something else.

这种操作方法反射(reflect)了我们如何通过将 DEBUG 设置设置为 True 来设置 Debug模式。

关于python - Celery worker 自省(introspection)以获取主机名/节点名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com