私のモデルの後処理は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)
ルーチンは IO を行うので、this_takes_forever
リクエストをブロックしすぎないように延期したいと考えています。
これは、新しい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()
Providedthis_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'.
このコンテキストでは、どこからループを開始すればよいかわかりません。誰かがこのようなことを試しましたか?