Асинхронные сигналы с асинхронностью

Моя модель постобработки использует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'.

Я не вижу, где я должен начать цикл в этом контексте. Кто-нибудь пробовал что-то подобное?

Ответы на вопрос(1)

Ваш ответ на вопрос