Celery chord failing with ValueError: not enough values to unpack (expected 2, got 1)

Celery chord failing with ValueError: not enough values to unpack (expected 2, got 1)

我 运行ning celery v5.2.3 在 docker 容器中 运行ning ubuntu.

在这里,我试图让芹菜和弦发挥作用,但我所做的每一次尝试都给我:

    File "/usr/local/lib/python3.7/site-packages/celery/result.py", line 1056, in result_from_tuple
    res, nodes = r
ValueError: not enough values to unpack (expected 2, got 1)

出现此错误后,和弦不断重试:

retry: Retry in 1.0s: ValueError('not enough values to unpack (expected 2, got 1)')

我正在尝试运行的任务如下:

@celery_app.task(shared=False)
def add(x, y):
    return x + y


@celery_app.task(shared=False)
def tsum(numbers):
    return numbers

@celery_app.task(name="celery.test")
def test():
    x = chord([add.s(i, i) for i in range(10)], body=tsum.s())
    r = x.apply_async()
    r.get()

我的样本 运行s 进行了 9/10 次迭代,但随后失败了。

芹菜工人是运行:

celery -A scheduler worker -P eventlet -l info 

你们谁能告诉我我做错了什么,因为我在互联网上找不到任何解释这个问题的东西?

对于将来遇到此问题的任何不幸的灵魂。

这个问题是因为我们有 celery 的 mongo 后端的自定义实现。 这里我们定义了任务的元字段如下:

meta = {
            "_id": task_id,
            "status": status,
            "result": result,
            "date_done": datetime.utcnow(),
            "traceback": traceback,
            "children": self.encode(
                self.current_task_children(request),
            ),
            "task_name": task_name,
            "task_args": task_args,
            "task_kwargs": task_kwargs,
            "worker": worker,
        }

然而,由于 celery 期望 children 字段是 children 或 None 的列表,我的问题是因为 children 字段总是由一个空列表。

通过将 children 更改为:

"children": self.encode(
    self.current_task_children(request),
)
if len(self.current_task_children(request)) > 0
else None,

问题就解决了。

如果有人遇到这种情况,我希望这会有所帮助