首页 > 解决方案 > 在 Python 中并行化一个简单的循环并使用 concurrent.futures 获得结果

问题描述

假设我有无法在列表上运行的复杂功能:

import concurrent.futures
import random
import numpy as np    

inputData = random.sample(range(60000, 1000000), 50)

def complicated_function(x):
"""complicated stuff"""
return x**x

我可以通过这种方式直接在循环中处理(这就是我希望代码末尾的结果,如果可能的话,使用相同的顺序):

#without parallelization
processedData = [complicated_function(x) for x in inputData]

对于并行处理,我查看教程并编写了以下代码:

#with parallelization
processedData2 = []
with concurrent.futures.ThreadPoolExecutor() as e:
    fut = [e.submit(complicated_function, inputData[i]) for i in range(len(inputData))]
    for r in concurrent.futures.as_completed(fut):
        processedData2.append(r.result())

问题是,在我的系统监视器上观看时,只有一个核心在运行..所以显然这不是我需要的工作......

非常感谢您的帮助!

标签: pythonparallel-processingconcurrent.futures

解决方案


这是因为您正在使用线程,当您使用线程时,pythons 全局解释器锁实际上并没有跨多个内核并行运行任务。

相反,您可以使用多处理..就像 ThreadPoolExecutor 一样,有一个 ProcessPoolExecutor 将确保使用多个核心。


推荐阅读