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