IPython.parallel不使用多核?

zer*_*ozf 11 python mapreduce ipython ipython-notebook ipython-parallel

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

我有以下笔记本:

单元格0:

from IPython.parallel import Client
client = Client()
print len(client)
5
Run Code Online (Sandbox Code Playgroud)

并启动命令:

单元格1:

%%px --targets 0 --noblock
!python server.py
Run Code Online (Sandbox Code Playgroud)

单元格2:

%%px --targets 1 --noblock
!python mincemeat.py 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

单元格3:

%%px --targets 2 --noblock
!python mincemeat.py 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

它的作用是使用mincemeatMapReduce 的实现.当我启动第!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
Run Code Online (Sandbox Code Playgroud)

单元格2:

%%px --targets 0 --noblock

a = 0
for i in xrange(100000):
    for j in xrange(10000):
        a += 1
Run Code Online (Sandbox Code Playgroud)

我想我错过了一些东西.我相信这两个单元应该运行一个不同的内核(如果可用).但是,似乎并非如此.CPU使用率再次显示它们共享相同的核心并使用50%的核心.我做错了什么?

min*_*nrk 15

聊天讨论摘要:

CPU亲和性是一种将进程固定到特定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()
Run Code Online (Sandbox Code Playgroud)

它采用multiprocessing.cpu_count获得CPU的数量,然后用所有的CPU每引擎相关联.

探索这个问题的IPython笔记本.