簡單的基於Python2.7版本的多進程下開發多線程的示例

簡單的基於Python2.7版本的多進程下開發多線程的示例
可以使得程序執行效率至少提升10倍

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
    @Time    : 2018/10/24
    @Author  : LiuXueWen
    @Site    : 
    @File    : transfer.py
    @Software: PyCharm
    @Description: 
"""

import os
import traceback
import threading
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool


# 兼容python2.7上多線程的bug,不加上下面的反代理程序不能正常執行
def proxy(cls_instance, i):
    return cls_instance.multiprocess_thread(i)
def proxy2(cls_instance, i):
    return cls_instance.file_operation(i)

class file2transfer():
    # 多進程執行程序
    def multiprocessingTransferFiles(self):
        try:
            # 創建進程池
            p = Pool()
            //參數末尾必須加上逗號
            p.apply_async(proxy, args=(self, self.root_path,))
            p.close()
            p.join()
        except Exception as e:
            print(e)

    # 每個進程下的多線程執行,線程數等於當前機器的核數
    def multiprocess_thread(self, root_path):
        try:
            # 創建線程鎖
            lock = threading.RLock()
            lock.acquire()
            # 獲取每個文件
            for pfile in os.listdir(root_path):
                # 獲取文件的完整路徑
                full_file_path = os.path.join(root_path, pfile)
                # 多線程讀寫文件
                p = ThreadPool()
                # 執行線程
                p.apply_async(proxy2, args=(self, full_file_path,))
                p.close()
                p.join()
        except Exception as e:
            print(e)
        finally:
            # 釋放線程鎖
            lock.release()

    # 對每個文件夾下的每個文件進行操作
    def file_operation(self, full_file_path):
        try:
            // TODO 真正需要單獨執行的操作
            pass
        except Exception as e:
            print(e)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章