【问题标题】:Python multiprocessing to always utilize x number of coresPython 多处理始终使用 x 个内核
【发布时间】:2022-01-03 08:31:44
【问题描述】:

我有以下代码,它使用 python 的多处理库使用 8 个内核进行一些繁重的计算。

import random
from multiprocessing import Process
random_numbers_list = [random.random()] * 10000000 

for i in range(0, len(random_numbers_list), 8):
    threads = []
    for j in range(i, i + 8):
        if j > len(random_numbers_list) - 1:
            break
        p = Process(target=do_heavy_computation,
                    args=(random_numbers_list[j], j))
        threads.append(p)

    [t.start() for t in threads]
    [t.join() for t in threads]

但是,问题是,虽然所有 8 核都被正确地用于并行计算,但它会等待当前 8 核批处理完成,直到下一个 8 核批处理开始。我希望代码始终使用 8 个内核,这样当任何一个内核完成时,它会使用总共 8 个内核中的下一个可用内核。任何指导将不胜感激!

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

让进程池为您处理一切。

from multiprocessing import Pool

with Pool(processes=8) as pool:
    for index, value in enumerate(random_numbers_list):
        pool.apply(do_heavy_computation, args=(value, index))

Pool() 初始值设定项具有您可以调查的其他参数。但是上面的代码是你在 8 个进程上运行你的代码所需要的,并等待它完成。

您可能需要更改的最重要的参数是maxtasksperchild,其默认值为None。将创建八个线程,您的所有任务都将在这八个线程上运行。您可以将其更改为masktasksperchild=1,每个线程将只运行一个任务,然后死掉并被一个新线程替换。这就是你在上面所做的,但目前还不清楚这是否有必要。

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 2017-03-06
    • 2021-04-22
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多