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

Ban*_*ana 4 python django subprocess celery python-2.7

我知道有很多问题与这个问题类似,但就我的研究而言,没有一个能回答我的具体问题。我希望你能花时间帮助我,因为我已经为此苦苦挣扎了好几天没有找到正确的答案。

我试图找到将子流程实现到 Django 应用程序的最佳方法。更具体:

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

有谁知道哪种方式最适合实现这一点?是否有任何 Python 模块(例如subprocess, threads, multiprocessing, spawn)能够实现这一点,还是我必须实现一个外部任务队列,例如 Celery?

Dan*_*ead 5

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

需要注意的一件事是,您可能应该运行包括close_fds=True调用值在内的命令。(所以check_call(['/usr/bin/nohup', '/tasks/do_long_job.sh'], close_fds=True))。为什么?默认情况下,所有子进程都可以访问父进程的打开文件描述符,包括端口。这意味着如果您需要重新启动 Web 服务器进程,而长进程正在运行,则正在运行的进程将保持端口打开,并且您将无法再次加载服务器。你可以猜到我是如何发现这一点的。:-)