gpt4 book ai didi

python - celery - 链接组和子任务。 -> 乱序执行

转载 作者:IT老高 更新时间:2023-10-28 20:33:02 25 4
gpt4 key购买 nike

当我遇到以下情况时

group1 = group(task1.si(), task1.si(), task1.si())
group2 = group(task2.si(), task2.si(), task2.si())

workflow = chain(group1, group2, task3.si())

直观的解释是 task3 应该只在组 2 中的所有任务都完成后执行。

实际上,任务 3 在 group1 已启动但尚未完成时执行。

我做错了什么?

最佳答案

事实证明,在 celery 中,您不能将两组链接在一起。
我怀疑这是因为与任务链接的组自动成为一个和弦
--> celery 文档:http://docs.celeryproject.org/en/latest/userguide/canvas.html

Chaining a group together with another task will automatically upgrade it to be a chord:

组返回父任务。当将两组链接在一起时,我怀疑当第一组完成时,和弦开始回调“任务”。我怀疑这个“任务”实际上是第二组的“父任务”。我进一步怀疑这个父任务在完成启动组内的所有子任务后立即完成,因此执行第二组之后的下一个项目。

为了证明这一点,这里有一些示例代码。您需要已经有一个正在运行的 celery 实例。

# celery_experiment.py

from celery import task, group, chain, chord
from celery.signals import task_sent, task_postrun, task_prerun

import time
import logging

import random
random.seed()

logging.basicConfig(level=logging.DEBUG)

### HANDLERS ###
@task_prerun.connect()
def task_starting_handler(sender=None, task_id=None, task=None, args=None, kwargs=None, **kwds):
try:
logging.info('[%s] starting' % kwargs['id'])
except KeyError:
pass

@task_postrun.connect()
def task_finished_handler(sender=None, task_id=None, task=None, args=None, kwargs=None, retval=None, state=None, **kwds):
try:
logging.info('[%s] finished' % kwargs['id'])
except KeyError:
pass


def random_sleep(id):
slp = random.randint(1, 3)
logging.info('[%s] sleep for %ssecs' % (id, slp))
time.sleep(slp)

@task()
def thing(id):
logging.info('[%s] begin' % id)
random_sleep(id)
logging.info('[%s] end' % id)


def exec_exp():
st = thing.si(id='st')
st_arr = [thing.si(id='st_arr1_a'), thing.si(id='st_arr1_b'), thing.si(id='st_arr1_c'),]
st_arr2 = [thing.si(id='st_arr2_a'), thing.si(id='st_arr2_b'),]
st2 = thing.si(id='st2')
st3 = thing.si(id='st3')
st4 = thing.si(id='st4')

grp1 = group(st_arr)
grp2 = group(st_arr2)

# chn can chain two groups together because they are seperated by a single subtask
chn = (st | grp1 | st2 | grp2 | st3 | st4)

# in chn2 you can't chain two groups together. what will happen is st3 will start before grp2 finishes
#chn2 = (st | st2 | grp1 | grp2 | st3 | st4)

r = chn()
#r2 = chn2()

关于python - celery - 链接组和子任务。 -> 乱序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com