python子进程修改父进程内变量_如何将父变量传递给python中的子进程?
這里的簡單答案是:不要使用subprocess.Popen,使用
multiprocessing.Process.或者,更好的是,multiprocessing.Pool或
concurrent.futures.ProcessPoolExecutor.
使用子進程,程序的Python解釋器根本不了解子進程;據它所知,子進程正在運行Doom.所以沒有辦法直接與它共享信息.*但是通過多處理,Python控件啟動子流程并設置所有內容,以便您可以盡可能方便地共享數據.
不幸的是,“盡可能方便”仍然不像在一個過程中那樣方便100%.但你能做的通常是足夠好的.閱讀Exchanging objects between processes部分和以下幾節;希望其中一個機制正是您所需要的.
但是,正如我在頂部隱含的那樣,在大多數情況下,您可以通過使用池來使其更簡單.不要考慮“運行6個進程并與它們共享數據”,而是將其視為“在6個進程池上運行一堆任務”.任務基本上只是一個函數 – 它接受參數,并返回一個值.如果您要并行化的工作適合該模型 – 聽起來就像您的工作一樣 – 生活就像生活一樣簡單.例如:
import multiprocessing
import os
import sys
import analysis
parent_dir = os.path.realpath(sys.argv[0])
paths = [os.path.join(folderpath, file)
for file in os.listdir(folderpath)]
with multiprocessing.Pool(processes=6) as pool:
results = pool.map(analysis.analyze, paths)
如果您使用的是Python 3.2或更早版本(包括2.7),則不能在with語句中使用Pool.我相信你想要這個:**
pool = multiprocessing.Pool(processes=6)
try:
results = pool.map(analysis.analyze, paths)
finally:
pool.close()
pool.join()
這將啟動6個進程,***然后告訴第一個進行分析.分析(路徑[0]),第二個做分析.分析(路徑[1])等.一旦任何進程完成后,游泳池將為其提供下一個工作路徑.當它們全部完成后,您將獲得所有結果的列表.****
當然,這意味著生活在analysis.py中的頂級代碼必須移動到函數def analyze(path)中:所以你可以調用它.或者,更好的是,如果您確實要保存該導入行,則可以將該函數移動到主腳本中,而不是單獨的文件中.
*你仍然可以間接地共享信息,例如,將它編組成一些交換格式,如JSON,并通過stdin / stdout管道,文件,共享內存段,套接字等傳遞它,但是多處理有效地包含了這些信息.你要讓它變得更容易.
**關閉池有不同的方法,你也可以選擇是否立即加入它,所以你真的應該在某些時候閱讀細節.但是當你所做的只是調用pool.map時,它確實沒關系;保證游泳池關閉并準備好在地圖呼叫返回時立即加入.
***我不確定你為什么要6;大多數機器有4個,8個或16個核心,而不是6個;為什么不全部使用它們?最好的做法通常是完全省略進程= 6并讓多處理器向你的操作系統詢問使用多少內核,這意味著它仍然可以在你的新機器上全速運行,內核數量是你的兩倍.明年會買.
****這有點過于簡單;通常,池會為第一個進程提供一批文件,而不是一次一個,以節省一些開銷,如果需要優化或更仔細地對它們進行優化,則可以手動控制批處理.但通常你不在乎,這種過度簡化是好的.
總結
以上是生活随笔為你收集整理的python子进程修改父进程内变量_如何将父变量传递给python中的子进程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux执行sh提示非标准环境,Lin
- 下一篇: websocket python爬虫_p