Sinais assíncronos com asyncio
O pós-processamento do meu modelo está usando opost_save
sinal:
from django.core.signals import request_finished
from django.dispatch import receiver
from models import MyModel
from pipeline import this_takes_forever
@receiver(post_save, sender=MyModel)
def my_callback(sender, **kwargs):
this_takes_forever(sender)
othis_takes_forever
A rotina faz E / S, portanto, quero adiá-la para evitar o bloqueio excessivo da solicitação.
Eu pensei que este era um ótimo caso de uso para o novoassíncio módulo. Mas tenho dificuldade em entender o processo todo.
Eu acho que deveria ser capaz de adaptar o receptor de sinal assim:
@receiver(post_save, sender=MyModel)
def my_callback(sender, **kwargs):
loop = asyncio.get_event_loop()
loop.run_until_complete(this_takes_forever(sender))
loop.close()
Forneceuthis_takes_forever
também é adaptado para ser uma rotina.
@coroutine
def this_takes_forever(instance):
# do something with instance
return instance
Isso parece mágico demais para funcionar. E, de fato, ele pára com umAssertionError
:
AssertionError at /new/
There is no current event loop in thread 'Thread-1'.
Não vejo por onde devo iniciar o loop neste contexto. Alguém tentou algo assim?