我想从Django视图调用一个函数,可能需要2-5分钟才能完成。我计划异步调用它,在作业启动后返回,并使用AJAX轮询以等待FINISHED标志。
我不想使用像Celery + RabbitMQ这样的重量级解决方案,只需要一个简单的异步调用即可。
我该怎么办?我读过有关子进程,线程和扭曲的内容。哪个是在Django视图中使用的最佳(最安全)方式?
答案 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实例是线程安全的,或者是可序列化的,这样你就可以重用它来知道进程是否已经完成运行。