Асинхронные сигналы с асинхронностью
Моя модель постобработки используетpost_save
сигнал:
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)
this_takes_forever
рутина выполняет IO, поэтому я хочу отложить ее, чтобы избежать слишком частой блокировки запроса.
Я думал, что это отличный вариант использования для новогоasyncio модуль. Но мне трудно думать обо всем процессе.
Я думаю, что я должен быть в состоянии адаптировать приемник сигнала следующим образом:
@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()
Предоставленаthis_takes_forever
также приспособлен, чтобы быть сопрограммой.
@coroutine
def this_takes_forever(instance):
# do something with instance
return instance
Это звучит слишком волшебно, чтобы работать. И на самом деле это останавливается сAssertionError
:
AssertionError at /new/
There is no current event loop in thread 'Thread-1'.
Я не вижу, где я должен начать цикл в этом контексте. Кто-нибудь пробовал что-то подобное?