¿IPython.parallel no usa multinúcleo?

Estoy experimentando con IPython.parallel y solo quiero lanzar varios comandos de shell en diferentes motores.

Tengo el siguiente cuaderno:

Celda 0:

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

Y ejecuta los comandos:

Celda 1:

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

Celda 2:

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

Celda 3:

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

Lo que hace es usar la implementación de mincemeat de MapReduce. Cuando lanzo el primer !python mincemeat.py 127.0.0.1 , usa aproximadamente el 100% de un núcleo, luego, cuando lanzo el segundo, cae al 50% cada uno. Tengo 4 núcleos (+ núcleos virtuales) en la máquina y puedo usarlos cuando se inician directamente desde el terminal pero no en el Notebook.

¿Hay algo que este olvidando? Me gustaría usar un comando central para !python mincemeat.py 127.0.0.1 .

EDITAR:
Para mayor claridad, aquí hay otra cosa que no está utilizando múltiples núcleos:

Celda 1:

 %%px --targets 0 --noblock a = 0 for i in xrange(100000): for j in xrange(10000): a += 1 

Celda 2:

 %%px --targets 0 --noblock a = 0 for i in xrange(100000): for j in xrange(10000): a += 1 

Supongo que me estoy perdiendo algo. Creo que esas dos celdas deberían ejecutar un núcleo diferente si están disponibles. Sin embargo, no parece ser el caso. Nuevamente, el uso de la CPU muestra que comparten el mismo núcleo y usan el 50% de él. ¿Qué hice mal?

Resumen de la discusión del chat:

La afinidad de la CPU es un mecanismo para anclar un proceso a un núcleo de CPU en particular, y el problema aquí es que a veces la importación de números puede terminar en la CPU de procesos de Python, como resultado de la vinculación con bibliotecas BLAS particulares. Puedes desbloquear todos tus motores ejecutando este celular:

 %%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() 

Que utiliza multiprocessing.cpu_count para obtener el número de CPU, y luego asocia cada motor con todas las CPU.

Un cuaderno de IPython explorando el tema .