在Django中实现长时间运行的子进程的最佳方法?

时间:2013-11-23 21:37:11

标签: python django python-2.7 subprocess celery

我知道有很多类似于这个的问题,但就我的研究而言,他们都没有回答我的具体问题。我希望你能抽出时间帮助我,因为我一直在努力解决这个问题而没有找到合适的答案。

我正在尝试找到将子进程实现到Django应用程序的最佳方法。更具体一点:

  • 该过程将从一个视图(异步)运行并从另一个视图处理。
  • 这个过程可能会持续几个小时。
  • 同一个进程/程序的多个实例应该能够同时运行。
  • 除了知道过程何时完成(或者是否崩溃,因此可以重新运行)之外,不需要与之进行任何通信。

有谁知道哪种方式最好实现这个?任何Python模块(例如subprocessthreadsmultiprocessingspawn)是否能够实现此目的,或者我是否必须实现外部任务队列,例如芹菜?

2 个答案:

答案 0 :(得分:3)

如果您不想要像Celery这样复杂的东西,那么您可以使用subprocess + nohup来启动长时间运行的任务,将PID转储到文件中(检查{{1}如何执行此操作的文档)然后检查文件中包含的PID是否仍在运行(使用subprocess)。如果你愿意的话,你可以编写一个非常小的'包装器'脚本来运行你告诉它的任务,如果它崩溃了,写一个'crashed.txt'文件。

需要注意的一点是,您应该在调用中运行包含ps值的命令。 (所以close_fds=True)。为什么?默认情况下,所有子进程都可以访问父级的打开文件描述符INCLUDING ports。这意味着如果您需要重新启动Web服务器进程,则在长进程运行时,正在运行的进程将保持端口打开,并且您将无法再次加载服务器。你可以猜到我是怎么发现的。 : - )

答案 1 :(得分:2)

似乎大多数人推荐Celery,并且在使用它几个月后,我现在只能同意。 Time limitsconcurrent processes limitstask scheduling只是我发现的一些功能。

此外,如果在服务器上运行,Celery Flower是一个很好的插件,可以在外部跟踪进程。

相关问题