我知道有很多类似于这个的问题,但就我的研究而言,他们都没有回答我的具体问题。我希望你能抽出时间帮助我,因为我一直在努力解决这个问题而没有找到合适的答案。
我正在尝试找到将子进程实现到Django应用程序的最佳方法。更具体一点:
有谁知道哪种方式最好实现这个?任何Python模块(例如subprocess
,threads
,multiprocessing
,spawn
)是否能够实现此目的,或者我是否必须实现外部任务队列,例如芹菜?
答案 0 :(得分:3)
如果您不想要像Celery这样复杂的东西,那么您可以使用subprocess
+ nohup
来启动长时间运行的任务,将PID转储到文件中(检查{{1}如何执行此操作的文档)然后检查文件中包含的PID是否仍在运行(使用subprocess
)。如果你愿意的话,你可以编写一个非常小的'包装器'脚本来运行你告诉它的任务,如果它崩溃了,写一个'crashed.txt'文件。
需要注意的一点是,您应该在调用中运行包含ps
值的命令。 (所以close_fds=True
)。为什么?默认情况下,所有子进程都可以访问父级的打开文件描述符INCLUDING ports。这意味着如果您需要重新启动Web服务器进程,则在长进程运行时,正在运行的进程将保持端口打开,并且您将无法再次加载服务器。你可以猜到我是怎么发现的。 : - )
答案 1 :(得分:2)
似乎大多数人推荐Celery,并且在使用它几个月后,我现在只能同意。 Time limits,concurrent processes limits和task scheduling只是我发现的一些功能。
此外,如果在服务器上运行,Celery Flower是一个很好的插件,可以在外部跟踪进程。