Por que o multiprocessamento usa apenas um único núcleo depois que eu importo um numpy?

Não tenho certeza se isso conta mais como um problema do sistema operacional, mas pensei em perguntar aqui, caso alguém tenha alguma idéia do fim das coisas em Python.

Eu tenho tentado paralelizar um CPU-pesadofor loop usandojoblib, mas acho que, em vez de cada processo de trabalho ser atribuído a um núcleo diferente, acabo com todos eles sendo atribuídos ao mesmo núcleo e sem ganho de desempenho.

Aqui está um exemplo muito trivial ...

from joblib import Parallel,delayed
import numpy as np

def testfunc(data):
    # some very boneheaded CPU work
    for nn in xrange(1000):
        for ii in data[0,:]:
            for jj in data[1,:]:
                ii*jj

def run(niter=10):
    data = (np.random.randn(2,100) for ii in xrange(niter))
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()

... e aqui está o que vejo emhtop enquanto este script está sendo executado:

Estou executando o Ubuntu 12.10 (3.5.0-26) em um laptop com 4 núcleos. Claramentejoblib.Parallel está gerando processos separados para os diferentes trabalhadores, mas existe alguma maneira de eu fazer com que esses processos sejam executados em diferentes núcleos?

questionAnswers(3)

yourAnswerToTheQuestion