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: