Я на python 3,7 с django 2.2.3 работает. Мне нужно решение с asyncio, чтобы API мог просто вызывать функцию asyn c и возвращать ответ, не дожидаясь, как мы поступим с обещаниями jquery. определение my_coro
только для примера. Я буду запускать moviepy
функции, которые обычно требуют 40-50 секунд для завершения. Я не хочу, чтобы API долго ждал отправки ответа. Я также запутался в том, как обращаться с пулом потоков. как использовать пул потоков здесь? потому что я намерен также сделать итерации фильма быстрыми. Итак, как создать пул для обработки вызовов my_coro
?
async def my_coro(n):
print(f"The answer is {n}.")
async def main():
await asyncio.gather(my_coro(1),my_coro(2),my_coro(3),my_coro(4))
class SaveSnaps(APIView):
def post(self, request, format = None):
if request.user.is_anonymous:
return Response({"response":"FORBIDDEN"}, status = 403)
else:
try:
asyncio.run(main())
return Response({"response": "success"}, status = 200)
except Exception as e:
return Response({'response':str(e)}, status = 400)
Обновление: Я пытался использовать сельдерей. но так как я не буду использовать periodi c tasks & фактически метод, который мне нужно сделать асинхронным, получает массив BLOB-объектов в качестве параметра. task.delay
из сельдерея дает мне ошибку, потому что задачи ожидают сериализуемые параметры. Так что я вернулся к исходной точке по этому вопросу. Я не уверен, стоит ли мне придерживаться решения для многопоточности или чего-то еще.
Обновление: Я забыл поделиться тем, что я наконец сделал. Я перешел на celery
. но поскольку celery
task.delay
ожидают serialized params
, я переместил сохраняющую часть blob
в синхронный метод, который после завершения передает задачи moviepy в задачу celery
run.