Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python 3.x_Asynchronous_Celery_Celery Task - Fatal编程技术网

Python 为什么这组链的构造会导致芹菜出现异常?

Python 为什么这组链的构造会导致芹菜出现异常?,python,python-3.x,asynchronous,celery,celery-task,Python,Python 3.x,Asynchronous,Celery,Celery Task,我为没有提供MVCE提前表示歉意——不幸的是,由于这个问题的性质,它不适合使用最少的示例。尽管如此,我认为如果没有MVCE,它仍然是相当负责任的 我有一个任务列表,客户可以从中选择要在Flask中创建的任务子集。我创建如下任务: current_app.logger.info("Creating list of chained tasks..") chains = [functools.reduce( lambda x, y: x | y.s(foo, bar), remaining_t

我为没有提供MVCE提前表示歉意——不幸的是,由于这个问题的性质,它不适合使用最少的示例。尽管如此,我认为如果没有MVCE,它仍然是相当负责任的

我有一个任务列表,客户可以从中选择要在Flask中创建的任务子集。我创建如下任务:

current_app.logger.info("Creating list of chained tasks..")
chains = [functools.reduce(
    lambda x, y: x | y.s(foo, bar), remaining_tasks, first_task.s(foo, bar)
) for foo in foos]
所有任务都有类似的函数签名,类似于

@celery.task
def my_task(baz, foo, bar):
    # ...
    return baz
我尝试以以下方式执行该组:

current_app.logger.info("Created a group of chained tasks..")
g = group(*chains)
res = g.apply_async(args=(baz,), queue="default")
current_app.logger.info("Created a group of chained tasks..")
if len(chains) == 1:
    g = group(chains)
else:
    g = group(*chains)
res = g.apply_async(args=(baz,), queue="default")
我发现当调用
apply\u async
时,会引发两个异常:

Traceback (most recent call last):
  File "/Users/erip/.virtualenvs/foo/lib/python3.5/site-packages/celery/utils/functional.py", line 209, in __getitem__
    return self.__consumed[index]
IndexError: list index out of range

这表明我对链的构造是有效的,所以我不理解异步应用程序为什么会导致问题

我的目标是创建一组异步应用的
len(foos)
链。我发现这种行为只有在
len(foos)==1
时才会发生


以前有人遇到过这个问题吗?

我也遇到过类似的问题,芹菜文档有如下注释:

如果只传递了一个参数,并且该参数是iterable
然后将其用作任务列表:此
允许我们对生成器表达式使用
group

看看Group类的构造函数。如果我们只传递一个签名来初始化对象,则此签名将被视为生成器

def __init__(self, *tasks, **options):                                       
    if len(tasks) == 1:                                                      
        tasks = tasks[0]                                                     
        if isinstance(tasks, group):                                         
            tasks = tasks.tasks                                              
        if not isinstance(tasks, _regen):                                    
            tasks = regen(tasks)                                             
    Signature.__init__(                                                      
        self, 'celery.group', (), {'tasks': tasks}, **options                
    )                                                                        
    self.subtask_type = 'group'  
在您的情况下,您可以通过以下方式简单地执行一组任务:

current_app.logger.info("Created a group of chained tasks..")
g = group(*chains)
res = g.apply_async(args=(baz,), queue="default")
current_app.logger.info("Created a group of chained tasks..")
if len(chains) == 1:
    g = group(chains)
else:
    g = group(*chains)
res = g.apply_async(args=(baz,), queue="default")

这就是我最终解决问题的方法。很有意思,但我想这是最好的办法。谢谢你的回复!