12

我想要一个 celery 任务能够获取执行它的工作人员的名称,以用于记录目的。我需要从任务中处理这个问题,而不是直接查询代理。有没有办法做到这一点?如果这很重要,我将芹菜与 RabbitMQ 一起使用。

4

4 回答 4

7

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

from celery import task

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

该属性的名称对我来说听起来很奇怪,但它包含启动工作程序时使用“-n”选项指定的名称。self 就像你对类方法所期望的那样工作,你不需要在调用函数时指定它(例如:getName.delay())。

于 2016-09-15T12:25:45.793 回答
6

您需要使用容纳工人的台球:

from celery import task
from billiard import current_process

@task
def getName():
    p = current_process()
    return p.index

然后制作一个全局字典,在进程创建时映射 ids->names。

于 2014-05-25T15:42:38.687 回答
6

使用celeryd_after_setup信号来捕获工人名称,如下所示:

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)
于 2017-04-26T18:04:48.343 回答
3

您最初是在寻找带有 -n 标志的名称,对吗?它在 initargs 数组中。这是答案的修改版本,可以帮助您:

from celery import task
from billiard import current_process

@task
def getName():
    p = current_process()
    return p.initargs[1].split('@')[1]
于 2014-08-19T12:56:22.137 回答