我的目标是创建一个能够执行持久的主要系统任务的应用程序,例如:
问题是我需要以某种方式独立于Web浏览器进行准备。我的意思是,例如在开始结账/复制操作后,关闭Web浏览器不会中断操作。因此,在返回该站点后,我可以看到复制继续进行或者在浏览器关闭时启动了另一个操作...
我正在搜索各种工具,如RabbitMQ + Celery,Twisted,Pyro,XML-RPC,但我不知道这些工具是否适合我。有没有人在创建Django应用程序时遇到类似的需求?如果有任何我应该知道的方法/包,请告诉我。代码样本也将受到欢迎!
提前感谢您的建议!
(抱歉我的英语不好。我正在努力。)
答案 0 :(得分:7)
基本上,您需要拥有一个在请求之外运行的进程。绝对最简单的方法(至少在类Unix操作系统上)是fork()
:
if os.fork() == 0:
do_long_thing()
sys.exit(0)
… continue with request …
这有一些缺点,但是(例如,如果服务器崩溃,“长事”就会丢失)......这就是Celery可以派上用场的地方。它将跟踪需要完成的工作,作业的结果(成功/失败/无论如何),并使在其他机器上运行作业变得容易。
使用带有Redis后端的Celery(参见Kombu的Redis传输)非常简单,所以我建议先在那里查看。
答案 1 :(得分:3)
您可能需要在请求/响应周期之外进行处理。如果是这样的话,带有Redis后端的Celery就是我建议的,因为它与Django很好地集成(正如David Wolever建议的那样)。
另一种选择是创建Django management commands,然后使用cron按计划的时间间隔执行它们。