芹菜链任务



上下文:

任务.py

def chunkify(lst,n):
    return [ lst[i::n] for i in xrange(n) ]
@task
def swarm_restart(procs):
   chunks = chunkify(procs, 4)
    res = chain(
        group_restart.s(( [ (proc.name, proc.host.name) for proc in chunks[0] ] )),
        group_restart.s(( [ (proc.name, proc.host.name) for proc in chunks[1] ] )),
        group_restart.s(( [ (proc.name, proc.host.name) for proc in chunks[2] ] )),
        group_restart.s(( [ (proc.name, proc.host.name) for proc in chunks[3] ] )),
    )()
@ task
def group_restart(procs):
    # this task runs only once, seems to be called just 1 time
    res = group( proc_restart.s(proc[0], proc[1]) for proc in procs ).apply_async()
@ task
def proc_restart(proc_name, hostname):
    # This method works, tested several times
    proc = Host.objects.get(name=hostname).get_proc(proc_name)
    proc.restart()

视图.py

def call():
    procs = get_procs()
    tasks.swarm_restart.delay(procs)

我得到的错误:TypeError: group_restart() takes exactly 1 argument (2 given)

我做错了什么,有灯光吗?

顺便说一句。芹菜==3.0.25,django芹菜===3.0.23

如果查看您的swarm_restart任务,则表示您正在链接group_restart任务。在这里,链中的第一个任务将执行良好,但第二个任务将抛出错误。

类型错误:group_restart()只接受1个参数(给定2个)

因为,第一个任务的结果作为参数传递给它。链中的下一个任务也会发生同样的情况。

例如,

from celery import task, chain
@app.task
def t1():
    return 't1'
@app.task
def t2():
   return 't2'
wrong_chain = chain( t1.s(), t2.s() )

如果您执行wrong_chain,即使您没有向t2 传递任何参数,它也会经历类似的错误

所以,你必须根据你要做的事情来改变你的工作流程。

相关内容

  • 没有找到相关文章

最新更新