运行多个节点并安装了python Celery的任务在哪里?

时间:2015-05-10 11:37:56

标签: celery

如果我有多个工作人员在不同的节点上运行,我怎么知道一个任务被分配给哪个工作人员呢? 例如这里有两名工人10.0.3.101和10.0.3.102; Redis后端运行于10.0.3.100;当任务被发送到Redis后端的任务队列时,工作人员获取并执行它。工人是10.0.3.101还是10.0.3.102?

此外,如果一名工作人员说它是10.0.3.101运行任务并突然停止,我怎么知道失败?即Celery内部是否有内置的故障转移机制?

感谢。

1 个答案:

答案 0 :(得分:0)

我通过在Google上搜索解决了这个问题。 知识主要来自Celery文档。 我们可以在任务上下文中获取任务执行工作者的主机名,或使用命令获取工作者机器IP。任务定义为:

import time
import subprocess
from celery import current_task

@app.task
def report():
    id = current_task.request.id
    ip = subprocess.check_output(
        "ip addr | grep eth0 | grep inet |" +
        " cut -d t -f 2 | cut -d / -f 1", shell=True)
    ip = ip.split('\n')[0].split(' ')[-1]
    hostname = current_task.request.hostname
    current_task.backend.store_result(
        id, result={"ip": ip, "hostname":  hostname}, status="READY")
    time.sleep(100)
    return {
        "ip": ip,
        "hostname": hostname
    }

如果在机器或容器中启动工作人员:

celery worker -A node.tasks --hostname="visible_hostname_in_request.hostname"

然后我们可以使用以下行来获取工作人员的IP或主机名:

# python
>>> from node.tasks import report
>>> r = report.delay()
>>> r.result

据我所知,Celery中没有内置的故障转移机制,因此我们需要自己实现它;我们也可以使用第三方库,如dispy ......