2011-08-01 8 views
1

J'ai un peu de mal avec le traitement Parallèle en Python. Je suis complètement nouveau au concept de l'informatique parallèle. J'utilise le multitraitement qui vient avec Python standard.Problème avec multiprocessing.Pool en Python

J'ai 12 threads dans mon ordinateur. Je demande 12 ouvriers, mais je ne suis pas toujours capable d'obtenir tous les travailleurs que je demande. Mon problème se pose lorsque je n'ai pas accès à autant de travailleurs dont j'ai besoin pour traiter le nombre de tâches nTasks dans mon code ci-dessous (actuellement fixé à quatre). Qu'est-ce qui se passe alors est juste que le code est bloqué et ne parvient jamais à ce qui est sous le commentaire "# Get Results". Il semble aléatoire combien de travailleurs que je reçois (je demande toujours 12), mais le problème se pose quand je reçois trois travailleurs ou moins dans le code suivant:

import multiprocessing as mp 
import scipy as sp 
import scipy.stats as spstat 
import pylab 

def testfunc(x0, N): 
    print 'working with x0 = %s' % x0 
    x = [x0] 
    for i in xrange(1,N): 
     x.append(spstat.norm.rvs(size = 1)) # stupid appending to make it slower 
     if i % 10000 == 0: 
      print 'x0 = %s, i = %s' % (x0, i) 
    return sp.array(x) 

def testfuncParallel(fargs): 
    return testfunc(*fargs) 

pool = mp.Pool(12) # I have 12 threads 

nTasks = 4 
N = 100000 

tasks = [(x, n) for x, n in enumerate(nTasks*[N])] # nTasks different tasks 

result = pool.map(testfuncParallel, tasks) 
pool.close() 
pool.join() 

# Get results: 
sim = sp.zeros((N, nTasks)) 

for nn, res in enumerate(result):  
    sim[:, nn] = res 

pylab.figure() 
for i in xrange(nTasks): 
    pylab.subplot(nTasks,1, i + 1) 
    pylab.plot(sim[:, i]) 

pylab.show() 

J'ai essayé d'utiliser pool.map_async à la place de la piscine .map mais je ne peux pas contourner le problème.

Merci à l'avance,

Sincèrement,

Matias

+0

cela semble bien fonctionner pour moi - quelles versions de multiprocessing, scipy et pylab utilisez-vous? – Noah

+0

pourquoi demandez-vous 12 processus mais seulement soumettre 4 tâches? – Noah

+1

[aussi, pool.close() et pool.join() ne sont nécessaires qu'avec la version de map_async()] – Noah

Répondre

0

Il est avéré que cela était seulement un problème lors de l'exécution du mode de débogage dans l'aile éditeur, voir le commentaire Stephan Deibels dans mon autre question multiprocessing.Pool seems to work in Windows but not in ubuntu?.

+0

Ce n'est pas rare avec python .... J'ai eu des problèmes dans le passé avec IDLE. Vous penseriez qu'ils obtiendraient l'IDE qu'ils emballent avec python droite. – Richard

Questions connexes