【发布时间】:2015-08-03 10:19:20
【问题描述】:
我在基于 Intel i3 的机器上运行以下代码,该机器具有 4 个虚拟内核(2 个超线程/物理内核,64 位)并安装了 Ubuntu 14.04:
n = multiprocessing.cpu_count()
executor = ThreadPoolExecutor(n)
tuple_mapper = lambda i: (i, func(i))
results = dict(executor.map(tuple_mapper, range(10)))
代码似乎不是以并行方式执行的,因为 CPU 的持续使用率只有 25%。在利用率图表上,一次只有 4 个虚拟内核中的一个被 100% 使用。使用的核心每 10 秒左右交替一次。
但并行化在具有相同软件设置的服务器机器上运行良好。我不知道确切的内核数量或确切的处理器类型,但我确定它有几个内核并且利用率为 100%,并且计算速度加快(使用并行化后速度提高了 10 倍,使一些实验)。
我希望并行化也可以在我的机器上工作,而不仅仅是在服务器上。
为什么它不起作用?它与我的操作系统设置有关吗?我必须更改它们吗?
提前致谢!
更新: 有关背景信息,请参阅下面的正确答案。为了完整起见,我想给出一个解决问题的示例代码:
tuple_mapper = lambda i: (i, func(i))
n = multiprocessing.cpu_count()
with concurrent.futures.ProcessPoolExecutor(n) as executor:
results = dict(executor.map(tuple_mapper, range(10)))
在重用它之前,请注意您正在使用的所有函数都在模块的顶层定义,如下所述: Python multiprocessing pickling error
【问题讨论】:
-
试试
ProcessPoolExecutor。可能是GIL。 -
很有趣,但是我仍然对服务器显示 100% 利用率和没有并行化的事实感到恼火,因为它具有相同的软件软件设置。我会试试你的建议。
标签: python linux ubuntu parallel-processing