python - IPython.parallel 不使用多核?

标签 python mapreduce ipython ipython-notebook ipython-parallel

我正在试验 IPython.parallel,只想在不同的引擎上启动多个 shell 命令。

我有以下笔记本:

单元格 0:

from IPython.parallel import Client
client = Client()
print len(client)
5

然后启动命令:

单元格 1:

%%px --targets 0 --noblock
!python server.py

单元格 2:

%%px --targets 1 --noblock
!python mincemeat.py 127.0.0.1

单元格 3:

%%px --targets 2 --noblock
!python mincemeat.py 127.0.0.1

它的作用是使用 mincemeat MapReduce 的实现。当我启动第一个 !python mincemeat.py 127.0.0.1 时,它大约使用了一个内核的 100%,然后当我启动第二个时,它分别下降到 50%。我在机器上有 4 个内核(+ 虚拟内核),可以在直接从终端启动时使用它们,但不能在笔记本中使用。

有什么我想念的吗?我想为每个 !python mincemeat.py 127.0.0.1 命令使用一个核心。

编辑:
为了清楚起见,这里还有一个没有使用多核的东西:

单元格 1:

%%px --targets 0 --noblock

a = 0
for i in xrange(100000):
    for j in xrange(10000):
        a += 1

单元格 2:

%%px --targets 0 --noblock

a = 0
for i in xrange(100000):
    for j in xrange(10000):
        a += 1

我想我遗漏了什么。我相信如果可用的话,这两个单元应该运行一个不同的内核。然而,似乎并非如此。 CPU 使用率再次显示它们共享同一个内核并使用了 50%。我做错了什么?

最佳答案

聊天讨论摘要:

CPU affinity是一种将进程固定到特定 CPU 内核的机制, 这里的问题是有时导入 numpy 最终会将 Python 进程固定到 CPU 0, 作为链接特定 BLAS 库的结果。您可以通过运行此单元取消固定所有引擎:

%%px
import os
import psutil
from multiprocessing import cpu_count

p = psutil.Process(os.getpid())
p.set_cpu_affinity(range(cpu_count()))
print p.get_cpu_affinity()

其中使用multiprocessing.cpu_count获取CPU的数量,然后将每个引擎与所有CPU相关联。

一个 IPython 笔记本 exploring the issue .

关于python - IPython.parallel 不使用多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323743/

相关文章:

python - Python/IPython shell 中的对象字符串表示

python - 在 IPython 中使用 importlib 重新加载模块

python - numpy库如何实现n维数组?

python - Pytables。如何迭代唯一值?

hadoop - 如何在 mapper 或 reducer 中运行外部程序,将 HDFS 文件作为输入并将输出文件存储在 HDFS 中?

algorithm - Hadoop/MapReduce - 优化 "Top N"Word Count MapReduce 作业

python-3.x - 如何摆脱 Python Pandas 中的斜体并获取纯文本?

python - Pyside:在 QVBoxLayout 小部件中设置行的背景

python - 有没有办法查看 TfidfVectorizer 输出的 'grams' 列?

python - 我们可以使用hadoop运行现有程序还是只需要以mapreduce样式对其进行修改?