Asynchrone Signale mit Asynchronität

Meine Modellnachbearbeitung verwendet diepost_save Signal:

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)

Dasthis_takes_forever Routine macht IO, also möchte ich es aufschieben, um zu verhindern, dass die Anfrage zu stark blockiert wird.

Ich dachte, dies sei ein großartiger Anwendungsfall für das Neueasyncio Modul. Aber es fällt mir schwer, mich um den gesamten Prozess zu kümmern.

Ich denke, ich sollte in der Lage sein, den Signalempfänger so anzupassen:

@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()

Unter der Voraussetzungthis_takes_forever ist auch angepasst, um eine Koroutine zu sein.

@coroutine
def this_takes_forever(instance):
    # do something with instance
    return instance

Das klingt zu magisch, um zu arbeiten. Und in der Tat hält es mit einemAssertionError:

AssertionError at /new/
There is no current event loop in thread 'Thread-1'.

Ich sehe nicht, wo ich die Schleife in diesem Zusammenhang starten soll. Hat jemand so etwas probiert?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage