當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。
初始化pool時,可以指定乙個最大程序數,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立乙個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池中有程序結束,才會用之前的程序來執行新的任務
用程序池來實現乙個檔案拷貝的案例:
import multiprocessing
import time
import os
# 讀寫檔案
defcopy_file
(temp_file_dir_path, new_dir_path, file_name)
: data =
none
# 讀取檔案
with
open
(temp_file_dir_path,
"rb"
)as f_read:
data = f_read.read(
)if data:
# 寫入檔案
new_dir_path +=
"\\"
+ file_name
f_write =
open
(new_dir_path,
"wb"
) f_write.write(data)
f_write.close(
) time.sleep(1)
# 遞迴獲取檔案
defget_copy_file
(dict1, dir_path, po, new_dir_path)
:"""
:param dir_path:原始資料夾路徑
:param po:程序池
:param new_dir_path:新資料夾路徑
:return:
"""# 獲取資料夾中的所有檔案
file_names = os.listdir(dir_path)
for file_name in file_names:
# 檔案或者資料夾目錄
temp_file_dir_path = dir_path +
"\\"
+ file_name
# 判斷是否是資料夾,如果是就遞迴
if os.path.isdir(temp_file_dir_path)
:# 如果是資料夾直接遞迴在次掃瞄檔案,並且將新位址重新整合,以及建立新資料夾
# 這裡不能使用加等於,因為有多個資料夾的話將會出現不停的疊加字串導致路徑不對
new_dest_dir_path = new_dir_path +
"\\"
+ file_name
# print(new_dest_dir_path)
# 建立新資料夾
os.mkdir(new_dest_dir_path)
# 然後開始遞迴
get_copy_file(dict1, temp_file_dir_path, po, new_dest_dir_path)
# 判斷是否是檔案,是檔案就執行copy功能
elif os.path.isfile(temp_file_dir_path)
:# 儲存檔名
dict1[
"queue"
].put(file_name)
dict1[
"len"]+=
1# 使用程序池來copy檔案
(temp_file_dir_path, new_dir_path, file_name)
)# 程序池copy
defmain()
: dir_path =
new_dir_path = dir_path +
"【new】"
try:
# 建立新資料夾
os.mkdir(new_dir_path)
except
:pass
# 建立程序池
po = multiprocessing.pool(5)
# 使用queue來實現進度條
dict1 = multiprocessing.manager().
dict()
q = multiprocessing.manager(
).queue(
)# 來儲存檔名和檔案數量
dict1[
"queue"
]= q
dict1[
"len"]=
0print
(dict1)
# 獲取要複製的檔案並且複製
get_copy_file(dict1, dir_path, po, new_dir_path)
# 關閉子程序
po.close(
)# 等待子程序完結後在結束主程序
# po.join()
break_count =
0while
true
: break_count +=
1 file_name = dict1[
"queue"
].get(
)# 如果複製的資料數量與總數一致則表示已經複製完成,可以跳出迴圈
num = break_count / dict1[
"len"
]print
(f"拷貝進度為:%% %.2f 檔名為:"
%(num *
100)
)if dict1[
"len"
]<= break_count:
break
print
(dict1[
"len"])
if __name__ ==
"__main__"
: main(
)
python 程序 Python程序池
當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool時,可以指定乙個最大程序數,當有新的請求提交到poo...
Python 程序,程序池
注意 程序池中的程序如果發生異常時,主程序中並不會得到異常提示。如果程序池中的程序要使用佇列 queue 實現程序間通訊,必須使用queue multiprocessing.manager queue 的方式建立佇列 需要先導入multiprocessing模組 demo.py 程序池 coding...
python 執行緒池與程序池
參考文件 為實現程式併發執行和資源共享,提高程式效率,需要進行多執行緒以及多程序開發。在具體介紹之前,需要了解gil.gil是實現python直譯器 cpython 時引入的乙個概念,不是python特性。gil是全域性直譯器鎖,可以控制同一時刻只有乙個執行緒能夠執行,這樣在跑多執行緒的情況下,只有...