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.
@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
@Thomas: Le lien pour des exemples: http://www.parallelpython.com/content/view/17/31/ – pyfunc
Aurait dû être intitulé "Puzzling Parallel Python Problem". –