imi*_*org 10 python celery celery-task
我希望celery任务能够获取执行它的工作人员的名字,以便进行日志记录.我需要在任务中处理这个问题,而不是直接查询代理.有没有办法做到这一点?我正在使用芹菜和RabbitMQ,如果这很重要的话.
你需要利用持有工人的台球:
from celery import task
from billiard import current_process
@task
def getName():
p = current_process()
return p.index
Run Code Online (Sandbox Code Playgroud)
然后创建一个全局字典,在进程创建时映射ids-> names.
小智 5
我还需要工作者名称用于报告,所以我尝试了@cacois解决方案,但它似乎不适用于eventlet(current_process()没有initargs属性).所以我将把我的解决方案留在这里以供将来参考:
from celery import task
@task(bind=True)
def getName(self):
return self.request.hostname
Run Code Online (Sandbox Code Playgroud)
该属性的名称对我来说听起来很奇怪,但它包含启动worker时使用"-n"选项指定的名称.self就像你期望的类方法一样,在调用函数时你不需要指定它(例如:getName.delay()).
使用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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5618 次 |
| 最近记录: |