Вызов синхронной функции асинхронно в django-graphene mutation
Моя мутация содержит функцию, которая вызывает API для отправки SMS. Поскольку выполнение этой функции может занять некоторое время, а ее результат не имеет никакого отношения к тому, что возвращает мутация (Его не нужно отправлять обратно клиенту), я предпочитаю запускать ее асинхронно. Чтобы мутация выполнялась как можно быстрее.
Вот мой код:
class MyMutation(graphene.Mutation):
class Arguments:
phone = graphene.String(required=True)
success = graphene.Boolean()
@classmethod
def mutate(cls, root, info, phone):
...
...
myfunction() #The client should not wait for this function's execution.
return MyMutation(success=True)
примечание: myfunction НЕ является asyncфункцией. И я предпочитаю оставить это так.
Я не смог найти правильный способ сделать это в документации django-graphene.
Для запуска асинхронной функции необходимо использовать другие методы, вы можете использовать любой из следующих:
- django-background-tasks: Простой и не требует рабочего .
- python-rq: Отлично подходит для простых асинхронных задач .
- celery: Более полное решение .
Спасибо за ваш ответ. Я хотел узнать, есть ли какой-нибудь другой способ, кроме использования пакетов типа celery, как вы упомянули.
Итак, я установил celery с redis и сделал несколько начальных конфигураций. Я объявил myfunction в файле tasks.py и вызвал ее из мутации:
from .tasks import myfunction
class MyMutation(graphene.Mutation):
class Arguments:
phone = graphene.String(required=True)
success = graphene.Boolean()
@classmethod
def mutate(cls, root, info, phone):
...
...
myfunction().delay() #now this function is called asynchronously
return MyMutation(success=True)
Все работает гладко.