在 Python 中并行化一个简单循环并在 concurrent.futures 中获得结果
Parallelize a simple loop in Python and get results with 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())
问题是,在 运行ning 时,在我的系统监视器上看到只有一个核心在工作。所以很明显这没有按我的需要工作...
非常感谢您的帮助!
这是因为你在线程化,当你使用线程化时,python 的全局解释器锁实际上并没有运行跨多个内核并行的任务。
相反,您可以使用多处理。就像 ThreadPoolExecutor 一样,有一个 ProcessPoolExecutor 可以确保使用多个内核。
假设我有复杂的功能,我无法在列表中 运行 :
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())
问题是,在 运行ning 时,在我的系统监视器上看到只有一个核心在工作。所以很明显这没有按我的需要工作...
非常感谢您的帮助!
这是因为你在线程化,当你使用线程化时,python 的全局解释器锁实际上并没有运行跨多个内核并行的任务。
相反,您可以使用多处理。就像 ThreadPoolExecutor 一样,有一个 ProcessPoolExecutor 可以确保使用多个内核。