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這倆包的細節知識,其實我也不大懂,都是用著學著,查著