安装了 python Celery 的任务 运行 多个节点在哪里?
Where is a task running with multiple nodes having python Celery installed?
如果我在不同的节点上有多个工作人员 运行,那么我怎么知道任务分配给了哪个工作人员?
例如这里有两个工人 10.0.3.101 和 10.0.3.102; Redis 后端在 10.0.3.100 上运行;当任务被发送到任务队列到 Redis 后端时,工作人员获取并执行它。 worker 是 10.0.3.101 还是 10.0.3.102?
另外,如果一个worker说是10.0.3.101 运行一个任务突然停止,我怎么知道失败了?即 Celery 中是否有任何内置的故障转移机制?
谢谢。
我在 Google 上搜索解决了这个问题。
这些知识主要来自 Celery 文档。
我们可以在任务上下文中获取执行任务的 worker 的主机名,或者使用命令获取 worker 机器 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
}
如果在机器上或容器中启动 worker:
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 ...
如果我在不同的节点上有多个工作人员 运行,那么我怎么知道任务分配给了哪个工作人员? 例如这里有两个工人 10.0.3.101 和 10.0.3.102; Redis 后端在 10.0.3.100 上运行;当任务被发送到任务队列到 Redis 后端时,工作人员获取并执行它。 worker 是 10.0.3.101 还是 10.0.3.102?
另外,如果一个worker说是10.0.3.101 运行一个任务突然停止,我怎么知道失败了?即 Celery 中是否有任何内置的故障转移机制?
谢谢。
我在 Google 上搜索解决了这个问题。 这些知识主要来自 Celery 文档。 我们可以在任务上下文中获取执行任务的 worker 的主机名,或者使用命令获取 worker 机器 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
}
如果在机器上或容器中启动 worker:
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 ...