在Django视图中异步调用函数的最佳方法是什么?

时间:2014-07-23 02:02:37

标签: python django asynchronous web

我想从Django视图调用一个函数,可能需要2-5分钟才能完成。我计划异步调用它,在作业启动后返回,并使用AJAX轮询以等待FINISHED标志。

我不想使用像Celery + RabbitMQ这样的重量级解决方案,只需要一个简单的异步调用即可。

我该怎么办?我读过有关子进程,线程和扭曲的内容。哪个是在Django视图中使用的最佳(最安全)方式?

2 个答案:

答案 0 :(得分:4)

到目前为止,最好的解决方案是单独的作业排队系统,例如Celery;没有特别好的选择。这就是作业排队系统的用途。 Celery有一些更轻量级的替代品,比如RQ(Redis Queue),它使用Redis实例作为后端,并有一个方便的Django接口叫django-rq

我强烈建议您使用解决此问题的专用工具,因为临时解决方案往往会导致复杂且难以调试的问题。

答案 1 :(得分:1)

如果您不想使用Celery + Redis或RabbitMQ,您可以使用处理代码编写管理命令。从您的角度来看,您可以使用

等异步方式调用管理命令
from subprocess import Popen
p = Popen(['manage.py', 'my_command'])

正如有人在另一个问题上所说:Popen实例可以执行各种其他操作,例如您可以poll()查看它是否仍在运行。 我希望你得到的popen实例是线程安全的,或者是可序列化的,这样你就可以重用它来知道进程是否已经完成运行。