我正在开发一个基于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)
答案 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.setsid
(start_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)