[英]How to run in python subprocess without blocking parent process?
我知道這個問題是相似的: 1 , 2但是答案的這些問題並沒有解決我的問題。
簡而言之,工作流程:
1.Web應用程序將請求發送到后端。 (用django編寫)
2.后端啟動工作進程,通過調用以下命令來完成某些工作:
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 子進程庫中的Popen
對象。 子進程已成功啟動,我可以在第二個Shell控制台中觀察其工作進度。 后端中父進程的執行也正在進行中。 我能夠看到日志Sending response http 200
但是對Web應用程序的響應http 200從未出現。 但是,在子進程結束時(因為它已經結束了它的工作,或者我從外殼中殺死了它),Web應用程序會立即收到缺少的http 200響應。
問題:
如標題中所示,如何在python中運行子進程,使其不會阻止父進程發送http響應?
閱讀子 close_fds
庫的文檔后,我發現了標志: 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)
它解決了問題。 似乎子進程已獲取並阻止了父進程使用的套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.