如何在不阻塞父进程的情况下在python子进程中运行?

时间:2015-05-24 12:58:52

标签: python django multithreading sockets subprocess

我知道问题类似于:12但这些问题的答案并没有解决我的问题。

工作流程简而言之:

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响应?

1 个答案:

答案 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)

它解决了这个问题。似乎子进程已获取并阻止父进程使用的套接字。