­

python利用多進程多執行緒加速程式碼的執行效率

這裡不談理論知識, 什麼GIL什麼的,還有各種理論知識,可以自行搜索了解學習,這裡我只附上一些我常用的程式碼方法。

1. python多執行緒

多執行緒適用於IO密集型的程式,能夠很大程度上提升程式碼的執行效率,但是面對計算密集型的程式就有點無能為力了(這裡我在實際中進行影像處理時,試過,用多進程更好)

這裡附上一個多執行緒的一個套路程式碼

import multithreading
def image_processing(imageName,args1, args2):
    '''這個函數放置具體的影像處理程式碼, args1,args2為其他必要的參數
    '''
    pass
    
    
# 設置鎖
threadLock = threading.Lock()

def get_imgName(imgNames):
	'''利用鎖,獲得每一張圖片,這裡imgNames為一個迭代器
	'''
	print ('thread %s is running...' % threading.current_thread().name)
    while True:
        try:
            with threadLock:
                img_file_name = next(imgNames)  # 獲取原圖的文件名
        except StopIteration:
            return None
        image_processing(img_file_name, args1, args2,)
        
        
if __name__ == '__main__':
	    # #執行緒數
        thread_num = opt.thread_num
        ts = []
        for i in range(0, thread_num):
            t = threading.Thread(target=get_imgName, name='_parallel_save_imageThread %s' % i,
                args=(imgNames,))
            # t.setDaemon(True)   #把子進程設置為守護執行緒,必須在start()之前設置
            t.start()
            ts.append(t)
        for t in ts:
            t.join()

2. 多進程簡單程式碼

from multiprocessing import Pool


def image_processing(imageName,args1, args2):
    '''這個函數放置具體的影像處理程式碼, args1,args2為其他必要的參數
    '''
    pass


if __name__ == "__main__":
    # #進程數
    process_num = opt.process_num
    processing_pool = Pool(processes=process_num)

	
    #=========================================================#
    #                   多進程主要程式碼                          #
    #=========================================================#
    for img_file_name in  files:
       processing_pool.apply_async(
                func = image_processing,
                args = (img_file_name,args1, args2, )
            )
    processing_pool.close()
    processing_pool.join()

3. 多進程向同一個list或者dict寫元素

import multiprocessing

def image_processing(imageName,syn_info, args1, args2):
    '''這個函數放置具體的影像處理程式碼, args1,args2為其他必要的參數
    '''
    pass


if __name__ == '__main__':

   # 進程數
    processing_num = opt.processing_num
    # 進程池
    processing_pool = multiprocessing.Pool(processes=processing_num)
    # 最終保存的字典,需要採用多進程通訊的字典格式
    syn_info = multiprocessing.Manager().dict()
	# syn_info = multiprocessing.Manager().list()
   
    for img_file_name in range(files):
        processing_pool.apply_async(
                func = image_processing,
                args = (img_file_name, syn_info,args1, args2, )
            )
    processing_pool.close()
    processing_pool.join()

這裡記錄一下基本的框架程式碼,更多的multithreading與multiprocessign這倆包的細節知識,其實我也不大懂,都是用著學著,查著

Tags: