从芹菜任务中获取芹菜工人的名字?

时间:2014-05-25 15:37:18

标签: python celery celery-task

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

4 个答案:

答案 0 :(得分:8)

你需要利用持有工人的台球:

from celery import task
from billiard import current_process

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

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

答案 1 :(得分:5)

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

from celery import task

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

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

答案 2 :(得分:4)

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

from celery import task
from billiard import current_process

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

答案 3 :(得分:2)

使用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)