Как реализовать, если операторы async называются задачами сельдерея? - PullRequest
0 голосов
/ 30 сентября 2019

Я новичок в асинхронной задаче с колбой (сельдерей). Моя цель - реализовать очередь асинхронных задач.

У меня есть API-интерфейс успокоительного вызова Flask, вызывающий задачу. Resource.py выглядит следующим образом:

from flask_restful import Resource, reqparse
from app.tasks import get_data


class Data(Resource):

    def get(self, isin):

        output = get_data.apply_async(args=[isin])

        output_done = output.get()

        return output_done

, который вызывает задачу в task.py:

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')

@app.task(name='get_data')
def get_data(isin):

    df = pd.read_sql_table("data", engine)

    if isin in df["data"].tolist():
        subset = df[df["data"] == isin].iloc[0]

        output = some_calculation

        return output

    return {'message': 'data not found'}, 404

Когда я запускаю это, оператор if всегда выполняется из-за apply_asyncТак что мой вопрос в том, как правильно реализовать предложение if в асинхронной задаче?

Спасибо за помощь!

1 Ответ

0 голосов
/ 30 сентября 2019

Поправьте меня, если я ошибаюсь,

  • у вас есть задание на сельдерей с именем get_data
  • у вас есть API, определенный в классе Data
  • когда вы нажмете на этот API, вам нужно отправить задачу, и она должна выполняться асинхронно

Теперь внутри задачи,

  • у вас есть if isin in df["data"].tolist():
  • ваша проблема в том, что она работает всегда, независимо от того, какое значение вы даете isin

Глядя на код, я не думаю, что это проблема с кодом.
Это похоже на большую проблему с данными.

Не могли бы вы поделиться значениями isin и df["data"].tolist(), используя которые вы тестировали код.

...