TypeError: неподдерживаемый тип(ы) операнда для |: 'chain' и 'AsyncResult'.

<
ERROR/ForkPoolWorker-4] Task run-chain[...] raised unexpected: TypeError("unsupported operand type(s) for |: 'chain' and 'AsyncResult'")
<
from celery import chain, signature
from celery import shared_task



@shared_task(name = 'add')
def add(x, y):
    return x + y


@shared_task(name = 'substract')
def substract(x, y):
    return x - y


@shared_task(name = 'multiply')
def multiply(x, y):
    return x * y


@shared_task(name = 'divide')
def divide(x, y):
    return x / y


@shared_task(name = 'run-chain')
def run_chain(x, y):
    canvas = chain(
        add.s(x, y).apply_async(),
        substract.s(x, y).apply_async(),
        multiply.s(x, y).apply_async(),
        divide.s(x, y).apply_async()
    )
    return canvas

и это мой celery.py файл:

import os
from celery import Celery



os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirsttask.settings')

app = Celery()
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()

app.conf.beat_schedule = {
    'run-every-five-seconds': {
        'task': 'run-chain',  
        'schedule': 5.0,
        'args': (2, 3) 
    }
}  

Ваша помощь очень ценится!

Вызов chain должен вызываться не на результат задачи, а на задачу. Поэтому сделайте это, а затем выполните apply_async() на всей цепочке:

@shared_task(name = 'run-chain')
def run_chain(x, y):
    canvas = chain(
        add.s(x, y),
        substract.s(x, y),
        multiply.s(x, y),
        divide.s(x, y)
    ).apply_async()
    return canvas

Это не должно работать, потому что результат предыдущей задачи передается в качестве первого аргумента следующей задачи. Возможно, вы хотите сделать что-то вроде этого:

@shared_task(name = 'run-chain')
def run_chain(x, y):
    canvas = chain(
        add.s(x, y),
        substract.s(y),
        multiply.s(y),
        divide.s(y)
    ).apply_async()
    return canvas

Или что-то в этом роде.

Вернуться на верх