我的模型后处理使用 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'.
我不知道在这种情况下应该从哪里开始循环。有人尝试过类似于这样的操作吗?
runserver
,它只有一个线程。深入研究后发现,我需要连接一些非阻塞服务器,比如aiohttp。 - tutucarunserver
默认会创建一个新线程,在其中运行 Django 应用程序,这就是autoreload
功能的工作原理。 - Andrew Svetlov