【发布时间】:2013-05-01 18:04:54
【问题描述】:
我正在试验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
它的作用是使用 MapReduce 的 mincemeat 实现。当我启动第一个 !python mincemeat.py 127.0.0.1 时,它使用了大约 100% 的一个内核,然后当我启动第二个时,每个内核都下降到 50%。我的机器上有 4 个内核(+虚拟内核),可以在直接从终端启动时使用它们,但不能在 Notebook 中使用。
我有什么遗漏吗?我想每个!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%。我做错了什么?
【问题讨论】:
-
我不确定在这里使用 IPython.parallel 有什么意义,当您一次只在一台机器上运行单行 shell 命令时,IPython.parallel 不太可能有任何干扰您的子进程正在使用多少内核的能力。如果您在没有 IPython.parallel 的情况下执行相同的示例(因为它只是三个单行 shell 调用),它会是什么样子?
-
嗨@mnirk。如果没有 Ipython.parallel 单元格被阻塞,它就没有那么有趣了。为了澄清事情,我不想在不同的核心上运行一个进程,我宁愿每个进程都有一个核心。这就是为什么我将每个命令分配给不同的目标。但是,似乎所有引擎(目标 0 到 4)都在同一个内核上运行。
-
我的意思是在三个普通的终端会话中执行它 - 这就是您现在所做的一切,在三个单独的会话中运行单个 shell 命令。 IPython 根本没有真正参与。
-
我想隔离的主要事情是我怀疑 IPython 实际上与这种行为有什么关系。我希望你证明你的脚本在完全在 IPython 之外运行时会表现不同,我不希望它会这样。您实际上并没有在 IPython 进程中运行任何重要的代码 -
!启动了一个新的 shell 子进程。 -
@minrk,正如我在帖子中所说,当使用不同的 shell 时,它可以正常工作。我实际上是从在不同的终端会话中启动命令开始的,我达到了 6x100% 的 CPU 使用率(我实际上启动了 6 个映射器)。我想在笔记本中重现它。
标签: python mapreduce ipython ipython-notebook ipython-parallel