我知道有很多问题与此类似,但就我的研究而言,没有一个能回答我的具体问题。我希望你能抽出时间来帮助我,因为我已经为此苦苦挣扎了好几天都没有找到合适的答案。
我正在尝试找到将子进程实现到 Django 应用程序中的最佳方法。更具体地说:
- 该流程将从一个 View (异步)运行并从另一个 View 处理。
- 这个过程可能会持续几个小时。
- 同一进程/程序的多个实例应该能够同时运行。
- 除了知道进程何时完成(或者它是否崩溃,以便重新运行)之外,不需要与它进行任何通信。
有谁知道哪种方式最适合实现这个?是否有任何 Python 模块(例如 subprocess
、threads
、multiprocessing
、spawn
)能够实现这一点还是我必须实现一个外部任务队列,例如 Celery?
最佳答案
如果你不想要像 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 服务器进程,而长进程正在运行,正在运行的进程将保持端口打开,您将无法再次加载服务器。你可以猜到我是怎么发现的。 :-)
关于python - 在 Django 中实现长时间运行的子进程的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20168198/