Frage

Der folgende Code erscheint nicht richtig für mich zu arbeiten. Es erfordert in Ihrem Netzwerk einen ppserver auf einen anderen Computer starten, zum Beispiel mit dem folgenden Befehl:

ppserver.py -r -a -w 4

Sobald dieser Server gestartet wird, auf meinem Rechner laufe ich diesen 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'

Der ungeradee Teil: Betrachtet man die /home/tomb/statusfile.txt, kann ich sehen, dass es mehrmals geschrieben zu werden, als ob die Funktion mehrmals ausgeführt wird. Ich habe dies vor über eine Stunde lang fortgesetzt beobachtet und nie eine job() Rückkehr gesehen.

Odder: Wenn ich die Anzahl der Iterationen in der testfunc Definition zu 10 ändern ** 8, wird die Funktion nur einmal ausgeführt, und gibt ein Ergebnis wie erwartet!

Es scheint wie eine Art Race-Bedingung? mit nur lokalen Kernen funktioniert gut. Dies ist mit pp v 1.6.0 und 1.5.7.

Update: Rund 775 Millionen: Ich inkonsistente Ergebnisse erhalten. Zwei Jobs einmal wiederholen, auf beendet das erste Mal

Woche später aktualisieren: Ich habe meine eigene parallele Verarbeitungsmodul geschrieben, dies zu umgehen, und wird parallel Python in Zukunft vermeiden, es sei denn, diese aus jemandem Zahlen - ich werde es bekommen um zu schauen, um einige mehr (eigentlich Tauchen in die Quelle an einem gewissen Punkt-Code).

Einige Monate später aktualisieren: keine harten Gefühle bleiben, Parallel Python. Ich plane, sobald ich Zeit, meine Anwendung zu migrieren, bewegen zurück. Titel bearbeiten reflektieren Lösung.

War es hilfreich?

Lösung

Antwort von Bagira des Parallel Python-Forum:

  

Wie lange dauert die Berechnung von jedem   Job übernehmen? Werfen Sie einen Blick auf die Variable   TRANSPORT_SOCKET_TIMEOUT in   /usr/local/lib/python2.6/dist-packages/pptransport.py.

     

Vielleicht nimmt Ihr Job länger als die   Zeit in den Variablen oben. Erhöhen, ansteigen   der Wert und versucht.

Turns this out war genau das Problem. In meiner Anwendung verwende ich PP als Batch-Scheduler von Aufträgen, die mehrere Minuten dauern kann, so dass ich diese anpassen müssen. (Der Standard war 30s)

Andere Tipps

Es kann sein, dass die Bibliothek erlaubt Duplikate, da einige Knoten zurückbleiben werden es ein langer Schwanz von verbleibenden Aufgaben zu vervollständigen. Durch die doppelte Ausführung von Aufgaben, kann es die langsamen Knoten umgehen, und Sie sollten einfach und führt dazu, dass zuerst fertig. Sie können dies umgehen, indem eine eindeutige ID für jede Aufgabe einschließlich und nehmen nur die ersten für jeden zurückzukehren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top