Python日常筆記(25) 程序池

2021-10-04 08:23:45 字數 3014 閱讀 9028

當需要建立的子程序數量不多時,可以直接利用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是全域性直譯器鎖,可以控制同一時刻只有乙個執行緒能夠執行,這樣在跑多執行緒的情況下,只有...