簡體   English   中英

python和多處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM