gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:41:57 26 4
gpt4 key购买 nike

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

工作流程简而言之:

1.Web应用程序向后端发送请求。 (用 Django 编写)

2.后端启动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.子流程工作的进度由 Web 应用程序使用后端 api 进行监控。

问题:

Worker 是作为一个单独的 python 脚本实现的。为了运行 worker,我使用了 python subprocess 中的 Popen 对象。图书馆。子进程已成功启动,我可以在第二个 shell 控制台中观察它的工作进度。后台父进程的执行也在持续进行中。我能够看到日志 Sending response http 200,但对 Web 应用程序的响应 http 200 从未出现。然而,当子进程结束时(因为它已经结束了工作,或者我从 shell 中终止了它),Web 应用程序会立即收到丢失的 http 200 响应。

问题:

如标题所示,如何在 python 中运行子进程,并且不会阻止父进程发送 http 响应?

最佳答案

阅读 subprocess 的文档后库我找到了标志:close_fds。根据文档:

If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. (Unix only). Or, on Windows, if close_fds is true then no handles will be inherited by the child process. Note that on Windows, you cannot set close_fds to true and also redirect the standard handles by setting stdin, stdout or stderr.

我将代码中的行更改为:

subprocess.Popen(run_command)

至:

subprocess.Popen(run_command, close_fds=True)

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

关于python - 如何在不阻塞父进程的情况下在python子进程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30423766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com