Question

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:

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 impair: Regarder le /home/tomb/statusfile.txt, je peux voir qu'il devient plusieurs fois écrit, comme si la fonction est en cours d'exécution à plusieurs reprises. Je l'ai observé ce continue pendant plus d'une heure avant, et jamais vu un retour de job().

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

On dirait une sorte de condition de course? Juste en utilisant des noyaux locaux fonctionne très bien. Ceci est avec p v 1.6.0 et 1.5.7.

Mise à jour: Autour 775000000: Je reçois des résultats incohérents. Deux emplois répètent une fois, sur les finitions la première fois

Semaine mise à jour plus tard: J'ai écrit mon propre module de traitement parallèle pour contourner ce problème, et évitera python parallèle à l'avenir, à moins que quelqu'un chiffres ceci - je vais autour de regarder un peu plus (en fait la plongée dans le code source) à un moment donné.

mois plus tard mise à jour: Aucun reste rancœur, parallèle Python. Je prévois de revenir dès que j'ai le temps de migrer mon application. edit titre pour refléter la solution.

Était-ce utile?

La solution

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

  

Combien de temps le calcul de chaque   prendre de l'emploi? Jetez un oeil à la variable   TRANSPORT_SOCKET_TIMEOUT en   /usr/local/lib/python2.6/dist-packages/pptransport.py.

     

Peut-être que votre travail prend plus de temps que la   temps dans la variable ci-dessus. Augmenter   la valeur de celui-ci et essayer.

Il se trouve que ce fut exactement le problème. Dans ma demande j'utilise PP en tant que planificateur de lot d'emplois qui peut prendre plusieurs minutes, alors je dois régler cela. (La valeur par défaut est 30 ans)

Autres conseils

Il se peut que la bibliothèque autorise les doublons que certains nœuds en retard, il y aura une longue queue des tâches restant à accomplir. En dupliquant les tâches, il peut contourner les nœuds lents et vous devez juste prendre le résultat qui termine au premier. Vous pouvez contourner ce problème en incluant un identifiant unique pour chaque tâche et accepter que le premier à revenir pour chacun.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top