1. 程式人生 > >python中基於多工的檔案複製方法

python中基於多工的檔案複製方法

網路程式設計中,使用多工實現檔案的複製是非常有必要的。下面將簡要介紹兩種基於多工的檔案複製實現方式。

1.下面實現的是使用佇列實現檔案的多工複製過程

import multiprocessing
import os

def copied_old_folder(q, old_folder_name):
    '''檔案複製放入佇列中'''
    file_infos = []

    file_names = os.listdir("./" + old_folder_name)  # 路徑可以用當前目錄中的資料夾名錶示,也可以在前面新增'./',表示當前目錄
    for file_name in file_names:
        try:
            fr = open("./" + old_folder_name + '/' + file_name, "r")
            file_data = fr.read()
            file_infos.append((old_folder_name, file_name, file_data))
        except Exception as e:
            print("%s檔案複製過程出現錯誤,錯誤原因是:%s" % (file_name, e))
        else:
            print("%s檔案複製完成." % file_name)
        finally:
            fr.close()

    for file_info in file_infos:
        q.put(file_info)
    print("---所有檔案資料已經讀取並存儲到佇列中---")

def copy_to_folder(q):
    '''複製資料到新資料夾中'''
    # 從對列中提取資料
    count = 0  # 記錄檔案個數
    while True:
        file_info = q.get()
        try:
            os.mkdir(file_info[0] + "[復件(佇列)]")
        except:
            pass

        try:
            fw = open("./" + file_info[0] + "[復件(佇列)]" + "/" + file_info[1], "w")
            fw.write(file_info[2])
            count += 1
        except Exception as e:
            print("%s檔案複製過程出現錯誤,錯誤原因是:%s" % (file_info[1], e))
        finally:
            fw.close()

        if q.empty():  # 這裡不能使用get方法,因為在佇列中沒有資料的時候不會犯會值,而會堵塞等待
            break
    print("---所有檔案共%d已經從佇列中複製到新資料夾中---" % count)


def main():
    # 多程序之間通過佇列完成程序間通訊
    # 建立一個佇列
    q = multiprocessing.Queue(10)
    old_folder_name = input("請輸入要複製的資料夾:")
    # 建立多個程序,將佇列的引用當作實參進行傳遞到裡面
    # old_folder_name = input("請輸入要複製的資料夾:")
    # p1 = multiprocessing.Process(target=copied_old_folder, args=(q, old_folder_name))  # 必須在main中定義要複製的資料夾,
    # # 因為在程序中,個進成的執行是沒有關係的,

    p1 = multiprocessing.Process(target=copied_old_folder, args=(q, old_folder_name))  # 必須在main中定義要複製的資料夾,
    # 因為在程序中,個進成的執行是沒有關係的,
    p2 = multiprocessing.Process(target=copy_to_folder, args=(q,))  # 這裡的程序引數需要有佇列
    p1.start()
    p2.start()

if __name__ == "__main__":
    main()

2、下面實現的是使用程序池實現檔案的多工複製過程

import os
import time
import random
import multiprocessing
'''使用程序池複製檔案'''

def copy_file(copy_file_name, folder_name, new_folder_name):
    '''完成檔案到複製'''
    t_start = time.time()

    try:
        fr = open("./" + folder_name + "/" + copy_file_name, "r")
        fw = open("./" + new_folder_name + "/" + copy_file_name, "w")
        try:
            print(">>>>>>%s檔案開始複製<<<<<<" % copy_file_name)
            file_content = fr.read()
            fw.write(file_content)
            # time.sleep(random.random()*2)
            t_stop = time.time()
            print(">>>>>>%s檔案複製完成,消耗時間為:%.2f<<<<<<" % (copy_file_name, (t_start - t_stop)))
        except Exception as e:
            print("%s檔案複製失敗,錯誤原因為:%s" % (copy_file_name, e))
    except Exception as e:
        print("%s檔案開啟失敗,錯誤原因為:%s" % (folder_name, e))
    finally:
        fw.close()
        fr.close()
    # print("這裡被執行===========================================")  # 這裡會被執行
def main():
# 獲取使用者要copy的檔案
    folder_name = input("請輸入要複製的資料夾:")
    count = 0  # 記錄檔案個數
# 建立一個新的資料夾
    try:
        new_folder_name = folder_name + "[復件]"
        os.mkdir(folder_name + "[復件]")
    except:
        pass
# 獲取資料夾的所有的待copy的檔案 listdir()
    file_names = os.listdir(folder_name)  # 獲取資料夾中的所有檔案,以列表的形式返回

# 建立程序池
    po = multiprocessing.Pool(5)

# 向程序池中新增copy檔案的任務
    for file_name in file_names:
        po.apply_async(copy_file, args=(file_name, folder_name, new_folder_name))
        count += 1
# 複製原檔案中的檔案
    print("-----start-----")
    po.close()  # 關閉程序池,關閉後進程池將不再接收請求
    po.join()  # 等待所有子程序執行完畢,且必須在close()後面
    print("一共複製%d個檔案." % count)
    print("-----end-----")

if __name__ == "__main__":
    main()

上面的內容是兩種多工方式實現檔案複製的方法。歡迎指正,多多學習。