我知道问题类似于:1,2但这些问题的答案并没有解决我的问题。
工作流程简而言之:
1.Web应用程序向后端发送请求。 (用django写的)
2.Backend启动 worker 进程,通过调用来完成某项工作:
run_command = [sys.executable, my_python_worker, flags]
logger.debug('Created os update process "%s" ', run_command)
subprocess.Popen(run_command)
并且作为回报,父进程将 http 200 发送到Web应用程序:
logger.debug('Sending response http 200')
return Response(status=status.HTTP_200_OK)
3.通过使用后端api,Web应用程序监视子进程工作的进度。
问题:
Worker是作为单独的python脚本实现的。要运行 worker ,我使用了python subprocess库中的Popen
对象。
子进程已成功启动,我能够在第二个shell控制台中观察它的工作进度。后端中父进程的执行也在进行中。我能够看到日志Sending response http 200
,但响应 http 200 到Web应用程序从未到来。
但是,当子进程结束时(因为它已经结束它工作,或者我从shell中终止它),Web应用程序立即收到丢失的 http 200 响应。
问题:
在标题中,如何在python中运行subprocess,它不会阻止父进程发送http响应?
答案 0 :(得分:1)
在阅读subprocess库的文档后,我找到了标志:close_fds
。
根据文件:
如果close_fds为true,则在执行子进程之前将关闭除0,1和2之外的所有文件描述符。 (仅限Unix)。或者,在Windows上,如果close_fds为true,则子进程不会继承任何句柄。请注意,在Windows上,您不能将close_fds设置为true,还可以通过设置stdin,stdout或stderr来重定向标准句柄。
我的代码改为:
subprocess.Popen(run_command)
为:
subprocess.Popen(run_command, close_fds=True)
它解决了这个问题。似乎子进程已获取并阻止父进程使用的套接字。