學習筆記-多執行緒補充
阿新 • • 發佈:2018-12-13
多執行緒pool補充
在python中沒有辦法使用佇列進行傳入到pool中
這就導致如果要使用傳入佇列,那麼需要使用另外的封裝方法
使用pool和佇列模擬檔案複製
import random
import time
from multiprocessing import Manager
from multiprocessing import Pool
def my_copy_read(q,old_file):
# 開啟檔案將檔案內容讀取出來
with open(old_file,'r',encoding='utf-8') as f:
q. put(f.readlines()) # 將檔案內容讀到佇列中
# print(f'檔案{old_file}讀取完成')
def my_copy_write(q,new_file):
time.sleep(random.random()*2) # 隨機0-2秒鐘
# 從佇列中拿出資料並寫入新的檔案
with open(new_file,'w',encoding='utf-8') as f:
f.writelines(q.get())
# 檔案寫入完成後輸出
print(f'新檔案{new_file}寫入完成')
if __name__ == '__main__':
# 例項化佇列
q = Manager().Queue()
# 例項化程序池,並設定程序池只允許有3個程序同時執行
pool = Pool(2)
# 準備好檔案路徑列表
old_file_address = [f'./study{i}.py' for i in range(1,8)]
# 準備好新的檔案路徑列表
for i in old_file_address:
pool.apply_async(my_copy_read,(q,i))
# 寫檔案
for i in range (1,len(old_file_address)+1):
pool.apply_async(my_copy_write,(q,f'./{i}.txt'))
pool.close()
pool.join()
print('總程序結束')
使用的是from multiprocessing import Manager,在Manager上面存在Manager().Queue()例項化一個佇列,這個佇列的使用和常規的Queue方法是一樣的,同樣具有get和put方法,
這裡本身./路徑下存在7個檔案,將檔案複製到當前目錄下並改名