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
Или что-то в этом роде.