簡體   English   中英

如何在python子進程中運行而不阻塞父進程?

[英]How to run in python subprocess without blocking parent process?

我知道這個問題是相似的: 12但是答案的這些問題並沒有解決我的問題。

簡而言之,工作流程:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM