繁体   English   中英

多处理 Python 中的 for 循环

[英]Multiprocessing a for loop in Python

多处理 Python 中的 for 循环

我有一个程序目前需要很长时间才能运行,因为它处理大量文件。 我希望能够同时在我计算机上的所有 12 个处理器上运行该程序,以减少运行时间。 我一直试图让它工作一段时间,但每当我尝试运行它时似乎出现了问题。 在我尝试引入多处理之前,我的程序看起来像这样:

files = [file for file in listdir(data/) if isfile(join(data/, file))]

for file in files:
    filename = file
    ir = xr.open_dataset(path + filename)

    if __name__ == "__main__":

        pic_nr = np.unique(ir.pic)[0]

        image_lst = ir.time.searchsorted(
            ir.where(ir.pic == pic_nr, drop=True).time
        )
        run_and_save(image_lst[0:6], pic_nr))
        gc.collect()

从本质上讲,我想要代码做的是一次为多个处理器运行整个 for 循环,每个处理器都在名为“文件”的列表中的一个文件上工作,但即使在阅读之后我似乎也无法正确一些指南。 有人知道让它正常工作的最快方法吗?

我想到达那里的最快/最简单的方法是使用多处理池并让它跨(你的文件的)可迭代运行......一个具有固定数量的工作人员和一些额外信息来观察行为的最小示例是:

import datetime
import time

from multiprocessing import Pool

def long_running_task(filename):
    time.sleep(1)
    print(f"{datetime.datetime.now()} finished: {filename}")

filenames = range(15)

with Pool(10) as mp_pool:
    mp_pool.map(long_running_task, filenames)

这将创建一个由 10 个工作人员组成的池,并将在任务完成并且工作人员可用时使用filenames中的每个项目(这里只是一系列0..14整数作为替代)调用long_running_task

或者,如果您想自己迭代输入,您可以执行以下操作:

with Pool(10) as mp_pool:
    for fn in range(15):
        mp_pool.apply_async(long_running_task, (fn,))
    mp_pool.close()
    mp_pool.join()

这会将fn作为每个long_running_task调用的第一个位置参数传递...在分配所有工作时,我们需要close池以停止接受更多请求并join以等待任何未完成的作业完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM