如果我有多个在不同节点上运行的工人,那么我怎么知道将任务分配给哪个工人?例如这是两名工人10.0.3.101和10.0.3.102;Redis后端在10.0.3.100上运行;当任务被发送到任务队列重新后端时,工人会得到并执行它。该工人是10.0.3.101或10.0.3.102?
此外,如果一个工人说这是10.0.3.101运行任务并突然停止,我怎么知道失败?即芹菜内的机制是否内置失败?
谢谢。
我通过在Google上搜索解决了问题。知识主要来自芹菜文档。我们可以在任务上下文中获取任务执行工作的主机名,也可以使用命令获取Worker Machine 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"
然后,我们可以使用以下行获取Worker的IP或主机名:
# python
>>> from node.tasks import report
>>> r = report.delay()
>>> r.result
据我所知,芹菜中没有内置的故障机制,因此我们需要通过自我实施。另外,我们可以使用第三方libs,例如Dispy ...