簡體   English   中英

最簡單(最少量的樣板代碼)並行化python循環的方法?

[英]Easiest (least amount of boilerplate code) way to parallelize a python loop?

我有一些看起來像這樣的代碼:

for photo in photoInfo:
    if not('url' in photo):
        raise Exception("Missing URL: " + str(photo) + " in " + str(photoInfo))
    sizes = getImageSizes(photo['url'])
    photo.update(sizes)

這可能並不明顯,但代碼會為每張照片執行高延遲I / O(打開遠程URL)和適度CPU密集型進程(解析圖像和提取大小)的混合。

並行化此代碼的最簡單方法是什么?

到目前為止我嘗試過的

我在另一個更復雜的問題的答案中找到了這個代碼,但是我很難將它映射回我更簡單的用例:

from itertools import product
from multiprocessing import Pool

with Pool(processes=4) as pool:  # assuming Python 3
    pool.starmap(print, product(range(2), range(3), range(4)))

您可以使用Pool.map並行化圖像大小的獲取,並使用返回值和相同的鍵構建新的dict:

from multiprocessing import Pool

def get_image_size(photo):
    if 'url' not in photo:
        raise Exception("Missing URL: " + str(photo))
    return getImageSizes(photo['url'])

if __name__ == '__main__':
    with Pool() as pool:
        photoInfo = dict(zip(photoInfo, pool.map(get_image_size, photoInfo)))
from multiprocessing import Pool
import os

def user_defined_function(url):
    #your logic for a single url
    pass

if __name__ == '__main__':
    urls_list = ['u1','u2']
    pool = Pool(os.cpu_count())                         # Create a multiprocessing pool
    pool.map(user_defined_function, urls_list)

它的示例代碼可以根據您的使用情況進行修改。 我將列表的每個元素映射到您的函數並單獨執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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