从芹菜任务中获取芹菜worker的名称



我希望芹菜任务能够获得执行它的工作人员的名称,以便进行日志记录。我需要在任务内部处理这个问题,而不是直接查询代理。有办法做到这一点吗?我使用芹菜与RabbitMQ,如果这很重要。

使用celeryd_after_setup信号像这样捕获worker名称:

from celery.signals import celeryd_after_setup
@celeryd_after_setup.connect
def capture_worker_name(sender, instance, **kwargs):
    os.environ["WORKER_NAME"] = '{0}'.format(sender)

你需要利用台球容纳工人:

from celery import task
from billiard import current_process
@task
def getName():
    p = current_process()
    return p.index

然后创建一个全局字典,在进程创建时映射id ->名称

我还需要工人名称报告的目的,所以我尝试了@cacois的解决方案,但它似乎不与eventlet (current_process()没有initargs属性)工作。因此,我将把我的解决方案留在这里以供将来参考:

from celery import task
@task(bind=True)
def getName(self):
    return self.request.hostname

这个属性的名字听起来很奇怪,但它包含了启动worker时用"-n"选项指定的名称。self的工作方式就像你期望的类方法一样,你不需要在调用函数时指定它(例如:getName.delay())。

您最初是在寻找使用-n标志输入的名称,对吗?它在initargs数组中。下面是这个答案的修改版:

from celery import task
from billiard import current_process
@task
def getName():
    p = current_process()
    return p.initargs[1].split('@')[1]

相关内容

  • 没有找到相关文章

最新更新