Python 运行前绘制芹菜画布
有关于芹菜的记载。 但是,我希望在运行作业之前生成一个图表 假设我创建了一个简单的链:Python 运行前绘制芹菜画布,python,graph,celery,graphviz,Python,Graph,Celery,Graphviz,有关于芹菜的记载。 但是,我希望在运行作业之前生成一个图表 假设我创建了一个简单的链: c = chain(add.s(1, 2), mul(4)) 如何生成链的图形 谢谢 米基我也有同样的愿望。在运行作业之前生成图形。所以我做了一些工作:) 看来芹菜不允许吃。这样做的原因(至少我在尝试这样做时理解)是,在图中,每个节点都必须有一个唯一的名称。一旦画布被执行,这个唯一的名称就是芹菜任务id,但是在执行之前,没有任何东西允许这样的区别 因此,解决方案是自己生成这个图,当然要唯一地标识每个节点(为
c = chain(add.s(1, 2), mul(4))
如何生成链的图形
谢谢
米基我也有同样的愿望。在运行作业之前生成图形。所以我做了一些工作:) 看来芹菜不允许吃。这样做的原因(至少我在尝试这样做时理解)是,在图中,每个节点都必须有一个唯一的名称。一旦画布被执行,这个唯一的名称就是芹菜任务id,但是在执行之前,没有任何东西允许这样的区别 因此,解决方案是自己生成这个图,当然要唯一地标识每个节点(为此,计数器可以完成这项工作) 这是该职能部门的工作:
# -*- coding: utf-8 -*-
from celery.canvas import chain, group, Signature
def analyze_canvas(canvas):
return _analyze_canvas(canvas)['dependencies']
def _analyze_canvas(canvas, previous=[], i=0):
dependencies = []
if isinstance(canvas, chain):
for t in canvas.tasks:
if not (isinstance(t, group) or isinstance(t, chain)):
n = str(t) + " - (" + str(i) + ")"
i += 1
dependencies.append((n, previous))
previous = [n]
else:
analysis = _analyze_canvas(t, previous, i)
dependencies.extend(analysis['dependencies'])
previous = analysis['previous']
elif isinstance(canvas, group):
new_previous = []
for t in canvas.tasks:
if not (isinstance(t, group) or isinstance(t, chain)):
n = str(t) + " - (" + str(i) + ")"
i += 1
dependencies.append((n, previous))
new_previous.append(n)
else:
analysis = _analyze_canvas(t, previous, i)
dependencies.extend(analysis['dependencies'])
new_previous = analysis['previous']
previous = new_previous
elif isinstance(canvas, Signature):
n = str(t) + " - (" + str(i) + ")"
i += 1
dependencies.append((n, previous))
previous = [n]
return {"dependencies": dependencies,
"previous": previous}
它生成画布的依赖关系图。其思想只是迭代画布中的其他任务,并识别组/链/签名以生成正确的依赖项
从这一点上,您可以使用更多芹菜UTIL来生成点文件。下面是一个小的用法示例:
from celery_util import analyze_canvas
from celery.datastructures import DependencyGraph
from celery import Celery, group
app = Celery()
@app.task
def t1():
pass
@app.task
def t2():
pass
canvas = t1.si() | t2.si() | group(t1.si(), t1.si(), t2.si()) | t2.si()
d = analyze_canvas(canvas)
dg = DependencyGraph(it=d)
pipo = open("pipo.dot", "w+")
dg.to_dot(pipo)
在本例中,我只是声明了虚拟任务,并将它们链接/分组到一个漂亮的画布中。我使用芹菜utilDependencyGraph
来实现对象表示,并能够像我使用to_dot
方法那样将图形转储到dot中
而美好的结果是:
我已从更新了代码以使用celery4。它适用于链、组和和弦
from app.instant_design import get_instant_design_tasks
from celery.canvas import _chain, group, chord
def analyze_canvas(canvas):
return _analyze_canvas(canvas)[0]
def _analyze_canvas(canvas, previous=[], i=0):
dependencies = []
if isinstance(canvas, _chain):
for i, t in enumerate(canvas.tasks, i):
dep, previous = _analyze_canvas(t, previous, i)
dependencies.extend(dep)
elif isinstance(canvas, group) or isinstance(canvas, chord):
new_previous = []
for i, t in enumerate(canvas.tasks, i):
dep, p = _analyze_canvas(t, previous, i)
dependencies.extend(dep)
new_previous.extend(p)
if isinstance(canvas, chord):
dep, p = _analyze_canvas(canvas.body, new_previous, i)
return dependencies + dep, p
else:
t = canvas.name + " - (" + str(i) + ")"
dependencies = [(t, previous)]
previous = [t]
return dependencies, previous
你能把这个片段更新成芹菜4吗?感谢您的支持,但这并不容易:)在芹菜4中,
signature.freeze()
可用于在执行它之前获取AsyncResult
。