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?