Как отправить ответ потребителю API после завершения работы асинхронной задачи, созданной с помощью сельдерея? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть REST API (созданный с использованием django rest-framework), выставленный пользователю USER_1.Когда USER_1 обращается к этому API, моя система создает асинхронную задачу (созданную с использованием celery).Эта задача возвращает некоторый результат, который мне нужно вернуть обратно в USER_1.У меня вопрос, как этого добиться, не блокируя поток?Я попытался использовать метод задач .get(), но он блокирует основной поток, который не справляется с задачей асинхронного выполнения задач.

Ниже приведена структура моего кода:

views.py

class MyAPI(APIView):
    def post(self, request):
        task = some_async_task.delay()
        # Need a way here to get result returned by async task
        # for now sending some static response
        return JsonResponse({'status': 'Success'})

tasks.py

@app.task
def some_async_task():
    # some processing that takes few mins
    result = {'key1': 'value1'} # data I wish to send to USER_1
    return result

Я уже искал это и обнаружил, что некоторые люди предлагают использовать websockets.Честно говоря, я не знаю, websockets.Как это действительно работает?Придется ли пользователю USER_1 отправлять мне запросы через websockets?Или это то, что мне нужно реализовать на моей стороне?Или мы оба должны это реализовать?

Буду признателен за любую помощь и руководство.

...