Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行前绘制芹菜画布_Python_Graph_Celery_Graphviz - Fatal编程技术网

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)
在本例中,我只是声明了虚拟任务,并将它们链接/分组到一个漂亮的画布中。我使用芹菜util
DependencyGraph
来实现对象表示,并能够像我使用
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