2010-11-04 7 views
2

Le code suivant ne semble pas fonctionner correctement pour moi. Il faut commencer un ppserver sur un autre ordinateur sur votre réseau, par exemple avec la commande suivante:Problème Python Parallèle Puzzling - TRANSPORT_SOCKET_TIMEOUT

ppserver.py -r -a -w 4 

Une fois que ce serveur est démarré, sur ma machine, je lance ce code:

import pp 
import time 
job_server = pp.Server(ppservers = ("*",)) 
job_server.set_ncpus(0) 
def addOneBillion(x): 
    r = x 
    for i in xrange(10**9): 
     r+=1 
    f = open('/home/tomb/statusfile.txt', 'a') 
    f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n') 
    return r 

jobs = [] 
jobs.append(job_server.submit(addOneBillion, (1,),(), ("time",))) 
jobs.append(job_server.submit(addOneBillion, (2,),(), ("time",))) 
jobs.append(job_server.submit(addOneBillion, (3,),(), ("time",))) 

for job in jobs: 
    print job() 
print 'done' 

La partie étrange : En regardant le /home/tomb/statusfile.txt, je peux voir qu'il est écrit à plusieurs reprises, comme si la fonction était exécutée plusieurs fois. J'ai observé ceci continuant pendant plus d'une heure avant, et n'ai jamais vu un retour job().

Odder: Si je change le nombre d'itérations dans la définition de testfunc en 10 ** 8, la fonction est simplement exécutée une fois, et renvoie un résultat comme prévu!

On dirait un état de la concurrence? Juste en utilisant des noyaux locaux fonctionne très bien. C'est avec pp v 1.6.0 et 1.5.7.

Mise à jour: Environ 775 000 000: Je reçois des résultats incohérents: deux tâches se répètent une fois, se termine la première fois.

Mise à jour de la semaine suivante: J'ai écrit mon propre module de traitement parallèle pour contourner ce problème, et j'éviterai les pythons parallèles à l'avenir, à moins que quelqu'un ne s'en aperçoive - j'y reviendrai plongée dans le code source) à un moment donné.

Mois plus tard mise à jour: Aucun sentiment dur restant, Parallel Python. Je prévois de revenir dès que j'ai le temps de migrer mon application. Modifier le titre pour refléter la solution.

+0

@Thomas: nous sommes aveugles sans informations supplémentaires sur les travaux et autres détails de débogage d'exécution. Pourquoi ne pas essayer l'un des exemples en pp et voir si elles fonctionnent bien pour vous. Ce serait un bon début et ensuite prendre la fonction simple et utiliser votre code pour soumettre le travail. Voyez si cela fait une différence. De cette façon, vous pouvez affiner le problème. – pyfunc

+0

@Thomas: Le lien pour des exemples: http://www.parallelpython.com/content/view/17/31/ – pyfunc

+3

Aurait dû être intitulé "Puzzling Parallel Python Problem". –

Répondre

2

Réponse de Bagira du forum Python parallèle:

Combien de temps le calcul de tous les emplois prennent ? Jetez un oeil à la variable TRANSPORT_SOCKET_TIMEOUT dans /usr/local/lib/python2.6/dist-packages/pptransport.py.

Votre travail peut prendre plus de temps que l'heure dans la variable ci-dessus. Augmentez la valeur de celui-ci et essayez.

Il s'avère que c'était exactement le problème. Dans mon application, j'utilise PP comme un planificateur de lots de travaux qui peuvent prendre plusieurs minutes, donc je dois ajuster cela. (la valeur par défaut était 30s)

1

Il se peut que la bibliothèque autorise les doublons car certains noeuds sont en retard car il y aura une longue queue de tâches restantes à terminer. En dupliquant les tâches, il peut contourner les nœuds lents et vous devriez juste prendre le résultat qui finit en premier. Vous pouvez contourner ce problème en incluant un identifiant unique pour chaque tâche et n'accepter que le premier à retourner pour chaque tâche.

+0

Hm, je n'ai pas observé ou lu à propos de ce comportement de la part de python parallèle, mais c'est une possibilité. Dans mon cas, cependant, les travaux semblaient être exécutés à plusieurs reprises sur le même ordinateur - je suppose que cela pourrait tenir s'il ne retournait pas correctement, et le serveur a trouvé un client pas occupé, ainsi assigné le travail encore. – Thomas