Subprocess.Popen等到孩子完成

时间:2014-10-13 20:09:47

标签: python ubuntu webserver subprocess

我正在开发一个基于CGI,Apache2,python(2.76)的Web工具。 Web服务器位于Ubuntu虚拟机上。用户提交作业后,我希望服务器立即返回一个网页,显示即将发布的结果的链接。因为计算需要一些时间,所以我使用Subprocess.Popen来调用一个函数,它完成所有计算。下面显示了我的代码流程。我在自己的(Mac)计算机上测试过,它可以在计算完成之前立即返回一个网页。但是在Ubuntu虚拟机上,它会返回页面,直到计算结束。没有Subprocess.Popen在Ubuntu上工作吗?

Main()
   preprocess 
   return_a_wen_page
   Subprocess.Popen(function_do_calculation)

2 个答案:

答案 0 :(得分:0)

subprocess.Popen适用于Ubuntu。问题可能是您从Apache调用它。 您可以尝试重定向标准流:

with open(os.devnull, 'r+b', 0) as DEVNULL:
    subprocess.Popen(cmd, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL,
                     close_fds=True)

如果没有用,请同时添加preexec_fn=os.setsidstart_new_session=True模拟)。或者只是在可以自由调用subprocess.Popen而不是cgi脚本的机器上发送消息((unix)套接字,命名管道)到独立运行的守护进程(考虑celery之类的东西是否可以为你精简它)。

答案 1 :(得分:0)

这是我第一次做网络应用程序,我不知道mod_wsgi。

with open(os.devnull, 'r+b', 0) as DEVNULL:
      subprocess.Popen(cmd, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL,close_fds=True)