1. 程式人生 > >簡單的基於Python2.7版本的多程序下開發多執行緒的示例

簡單的基於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)