Celery工作流错误:TypeError:|:'AsyncResult'和'AsyncResult'不支持的操作数类型

时间:2018-07-20 15:10:41

标签: python-3.x celery

我对芹菜及其基本知识尚不熟,请原谅我的无知。我正在尝试设计如下的工作流程:

import os
from celery import Celery, group, chord, chain

class CeleryConfig:
    """
    Configuration for Celery
    """
    broker_url = os.environ.get('CELERY_BROKER_URL','mongodb://localhost:9001/jobs')
    result_backend = os.environ.get('CELERY_RESULT_BACKEND', 'mongodb://localhost:9001/')
    celery_mongodb_backend_settings = {
        "database": "results", 
        "taskmeta_collection": "test",
    }
    enable_utc = True
    timezone = "UTC"
    celery_imports = ('test',)
    task_always_eager = os.environ.get('CELERY_ALWAYS_EAGER', False)
    task_eager_propagates = os.environ.get('CELERY_EAGER_PROPAGATES',False)
    task_serializer = 'json'

celery_app = Celery("test")
celery_app.config_from_object(CeleryConfig)

@celery_app.task(bind=True)
def dummy_task(self, *args, **kwargs):
    return True

@celery_app.task(bind=True)
def a(self, pagination, *args, **kwargs):
    return pagination[0] + pagination[1]

@celery_app.task(bind=True)
def b(self, pagination, *args, **kwargs):
    return pagination[0] + pagination[1]

@celery_app.task(bind=True)
def workflow(self):
    batch_size = 10
    flow_a = chord(group(a.s((k,batch_size), max_retries=None) for k in range(5)), dummy_task.s())()
    flow_b = chord(group(b.si((k,batch_size), immutable=True, max_retries=None) for k in range(5)), dummy_task.s())()

    r = chain(flow_a, flow_b)()
    return r

task = workflow.apply_async()

我使用celery -A test worker -l info来经营芹菜工人。当我尝试执行上述脚本时,出现以下错误:

[2018-07-20 22:51:11,221: ERROR/ForkPoolWorker-1] Task test.workflow[aaea266e-bd5a-4414-a42f-83ccb5d16145] raised unexpected: TypeError("unsupported operand type(s) for |: 'AsyncResult' and 'AsyncResult'",)
Traceback (most recent call last):
File "/Users/sohaibfarooqi/projects/code/env/lib/python3.5/site-packages/celery/app/trace.py", line 382, in trace_task
R = retval = fun(*args, **kwargs)
File "/Users/sohaibfarooqi/projects/code/env/lib/python3.5/site-packages/celery/app/trace.py", line 641, in __protected_call__
    return self.run(*args, **kwargs)
File "/Users/sohaibfarooqi/projects/code/test.py", line 42, in workflow
     r = chain(flow_a, flow_b)()
 File "/Users/sohaibfarooqi/projects/code/env/lib/python3.5/site-packages/celery/canvas.py", line 784, in __new__
     return reduce(operator.or_, tasks)
TypeError: unsupported operand type(s) for |: 'AsyncResult' and 'AsyncResult'

尽管会引发此错误,但任务执行正常。有人可以告诉我我做错了什么,并指出正确的方向吗?

Celery版本: 4.2.0

Python版本: 3.5.0

1 个答案:

答案 0 :(得分:0)

在遇到类似情况之前,我一直遇到类似的错误

chain(task1.si(param1,param2),task2.si(paramX))()

如果使用“ si”代替“ s”,则它是不可变的,并且第一个结果不会传递给下一个任务。

有关此http://docs.celeryproject.org/en/latest/userguide/canvas.html#immutability

的更多信息