使用Django处理长时间运行的任务

15

我的目标是创建一个应用程序,能够执行长时间的系统任务,例如:

  • 从代码库中检出代码,
  • 在不同的本地位置之间复制目录,
  • 等等。

问题在于,我需要独立于Web浏览器来准备它。也就是说,例如在启动检出/复制操作后,关闭Web浏览器不会中断操作。因此,在回到该站点后,我可以看到复制正在进行或浏览器关闭时开始另一个操作...

我搜索了各种工具,如RabbitMQ + Celery、Twisted、Pyro、XML-RPC,但我不知道其中哪一个适合我。有人在创建Django应用程序时遇到过类似的需求吗?如果有任何我应该知道的方法/包,请告诉我。代码示例也将非常欢迎!

提前感谢您的建议!

(对于我的糟糕英语,抱歉。我正在改进。)

2个回答

11

基本上,您需要拥有一个在请求之外运行的进程。最简单的方法(至少在类Unix操作系统上)是使用fork()

if os.fork() == 0:
    do_long_thing()
    sys.exit(0)
… continue with request …

然而,这种方法也存在一些缺点(比如,如果服务器崩溃,“长时间运行的任务”就会丢失)...这就是 Celery 可以派上用场的地方。它将跟踪需要完成的作业,作业的结果(成功/失败/其他)并使在其他机器上运行作业变得容易。

使用 Redis 作为后端的 Celery(请参阅 Kombu 的 Redis 传输)非常简单,因此我建议首先尝试使用它。


1
非常感谢您的建议。我将尝试使用Redis后端的Celery。您能否为我提供一个可靠的示例或如何实现建议的方式?我想我会尝试这些:http://query7.com/tutorial-celery-with-django http://ask.github.com/celery/tutorials/clickcounter.html 它们看起来可靠吗?任何建议都不胜感激,谢谢! - user1029968
1
第二个链接绝对可靠,因为它是celery文档的一部分。事实上,我只用文档就能让所有东西都正常工作,所以我建议你从那里开始。 - David Wolever
此外,如果我们的回答有帮助,请点击答案左侧的向上箭头进行点赞。 - David Wolever
当然,我知道。不幸的是,这是我在stackoverflow上的第一篇帖子,我还没有足够的声望点数来奖励你。 - user1029968
啊,是吗?我以为它允许你给自己的问题的答案投赞成票。好吧。 - David Wolever
clickcounter 教程可能不符合您的需求。那是一种使用 Celery 消息传递的高级教程。您应该查看入门指南 http://django-celery.readthedocs.org/en/latest/getting-started/first-steps-with-django.html(如果您想要使用 Redis,请参阅 http://docs.celeryproject.org/en/latest/tutorials/otherqueues.html#redis)。 - asksol

6

如果您需要在请求/响应周期之外运行进程,我建议您考虑使用带有Redis后端的Celery,因为它可以与Django很好地集成(正如David Wolever所建议的那样)。

另一种选择是创建Django管理命令,然后使用cron在预定的时间间隔内执行它们。


感谢您对管理命令的建议。如果我在Celery + Redis解决方案上失败,我会仔细查看它。欢迎任何其他建议! - user1029968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接