如果我有多个工作人员在不同的节点上运行,我怎么知道一个任务被分配给哪个工作人员呢? 例如这里有两名工人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内部是否有内置的故障转移机制?
感谢。
答案 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 ......