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

标签 python django python-2.7 subprocess celery

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

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

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

有谁知道哪种方式最适合实现这个?是否有任何 Python 模块(例如 subprocessthreadsmultiprocessingspawn)能够实现这一点还是我必须实现一个外部任务队列,例如 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/

相关文章:

python - 在Python 3中使用MagicMethods计算欧几里德距离

python - pycrypto 和谷歌应用引擎

python - 字符串中随机字符的索引错误

python - 在 Django 中创建和更新用户配置文件

python - 使用 python 从 mysql 行 fetchall 创建具有多个值的嵌套字典

python - 使用 BeautifulSoup 解析所有 HTML 页面

python - django cms自定义应用程序页面无限重定向

django - 在 Django 模型迁移中,serialize=False 是什么意思?

python - 从异常对象中获取行号

python - 字典(映射,**kwargs)与字典(可迭代,**kwargs)