[英]python and multiprocessing
我在python中有三個函數,每個函數將一個圖像(圖像路徑)作為輸入,並進行簡單的圖像處理,並創建一個新圖像(圖像路徑)作為輸出。
在下面的示例中,一個功能依賴於另一個功能,即:alg2的功能將生成alg的功能的圖像作為輸入,而alg3的功能將生成alg2的功能的圖像指定為輸入,這取決於功能的alg1。
(希望您基本上不要介意)
由於它們的執行時間比較長(圖像處理就是這樣),我想問一下是否可以使用python多處理並行化它們。 我已經閱讀了有關多處理映射和池的信息,但是我很困惑。
每當我總結時,我都有三個相互依賴的功能,如果完成的話,我想一起運行它們。 我也想知道,如果這三個功能不是相互依賴的,即它們是自主的,我將如何以當代的方式執行這三個功能。
def alg1(input_path_image,output_path_image):
start = timeit.default_timer()
###processing###)
stop = timeit.default_timer()
print stop - start
return output_path_image
def alg1(output_path_image,output_path_image1):
start = timeit.default_timer()
###processing###
stop = timeit.default_timer()
print stop - start
return output_path_image1
def alg3(output_path_image1,output_path_image2):
start = timeit.default_timer()
###processing###
stop = timeit.default_timer()
print stop - start
return output_path_image2
if __name__ == '__main__':
alg1(input_path_image,output_path_image)
alg2(output_path_image,output_path_image1)
alg3(output_path_image1,output_path_image2)
這是我會做的:
我將圖像列表分成較小的部分。 然后,我將從這三個函數中選出一個(通過將其他兩個函數設為私有-為簡單起見)。 然后,您可以通過執行以下操作來加快整個過程:
from multiprocessing import Process
image_list = this_is_your_huge_image_list
# create smaller image lists e.g. [[1, 2, 3], [4, 5, 6], ..]
chunked_lists = [image_list[x:x+100] for x in xrange(0, len(image_list), 100)]
for img_list in chunked_lists:
p = Process(target=your_main_func, args=(img_list,))
p.start()
# without .join() here
聽起來您正在做一些CPU密集型工作,因此您需要使用multiprocessing.Process
對象,而不是threading.Thread
。 因此,您不能從multiprocessing.Process
返回,因此將需要使用multiprocessing.Manager
。
因此,這是您的代碼的改編版本,可與multiprocessing.Process
:
from multiprocessing import Process, Manager
def alg1(input_path_image,output_path_image, return_dict):
start = timeit.default_timer()
###processing###)
stop = timeit.default_timer()
print stop - start
return_dict['algo1'] = output_path_image
def alg2(output_path_image,output_path_image1, return_dict):
start = timeit.default_timer()
###processing###
stop = timeit.default_timer()
print stop - start
return_dict['algo2'] = output_path_image1
def alg3(output_path_image1,output_path_image2, return_dict):
start = timeit.default_timer()
###processing###
stop = timeit.default_timer()
print stop - start
return_dict['algo3'] = output_path_image2
if __name__ == '__main__':
manager = Manager()
return_dict = manager.dict()
a1 = Process(target=alg1, args=(output_path_image,output_path_image, return_dict))
a2 = Process(target=alg2, args=(output_path_image1,output_path_image1, return_dict))
a3 = Process(target=alg3, args=(output_path_image2,output_path_image2, return_dict))
jobs = [a1, a2, a3]
for job in jobs:
job.start()
for job in jobs:
job.join()
a1_return = return_dict['algo1']
a2_return = return_dict['algo2']
a3_return = return_dict['algo3']
您將需要對此進行進一步修改,以使您的打印語句有更多區別。 目前,它們只會打印一個數字,您將無法區分它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.