2016-06-24 23 views
0

Ich bin mir sicher, dass dies schon einmal gefragt wurde, ich sah überall und konnte nichts finden! Schreien Sie mich nicht an, wenn Sie finden, dass es ein Duplikat ist, geben Sie einfach einen Link oder kopieren Sie die Details.Python Sync Variablen in Multiprocessing

Sowieso habe ich diese Datenstruktur, wie folgt aus:

data = { 

    'sysstats': { 
     'sysgen_time': datetime.now (), 
     'sysgen_text': time.strftime ("%d-%b-%y %H:%M:%S"), 
     'connections': 0 
    }, 

    'test': { 
     'text': "ok" 
    } 

}; 

Jetzt habe ich einige Code, liefert, welche Daten [ ‚test‘] [ ‚text‘] ist, wenn Sie etwas eingeben, und wenn Sie fügen Sie einen Parameter hinzu, der es ändert. Sie können dann den Befehl ausführen, um es zurückzugeben, und es wird zurückgeben, was auch immer Sie es geändert haben.

Ich habe eine Funktion, um die Datenvariable zu sichern, damit wir später wieder laden können. Es wird mit Multiprocessing (multiprocessing.Process) ausgeführt, aber selbst nachdem der Text aktualisiert wurde, bleibt er so wie er vor "ok" im Multiprozess war ... Ich möchte, dass dieser Multiprozess mit der Datenvariable synchronisiert wird.

Verwenden Sie einfach die Datenstruktur ich habe, und bitte ein Beispiel machen, wie Sie zwischen einem Prozess und dem Rest der Datei ...

Der Grund, warum ich Multiprozessing bin mit synchronisieren möchte, ist, weil der Sicherungscode ist in einer while-Schleife überprüft, ob es 3 Minuten war, so kann es Backup ... der Haupt-Code hat bereits eine While-Schleife, wo ich die Backup-Schleife setzen müsste, so ging ich einfach mit Multiprocessing ...

Bitte Hilfe! Ich habe versucht, es auch in einen Thread zu schreiben, aber es hat den ganzen Text sehr langsam gedruckt, alles ist zu Mist geworden, also kann ich nur Multiprocessing machen.

+0

Machen Sie die Variable für alle Threads zugänglich und verwenden Sie eine 'threading.Lock', um die sync_up zu tun.Vielleicht möchten Sie Ihren Code für weitere Hilfe posten:/ – LumiG

+0

Sie können einen 'multiprocessing.Manager' verwenden, um alle Prozesse zu synchronisieren. Dies scheint jedoch eine bessere Aufgabe für 'threading' zu sein ... – mgilson

Antwort

0

Nun, könnte ich vorschlagen, die Möglichkeit einer Redesign?

Es scheint, aus Ihrer Beschreibung, dass Sie einen Prozess/Thread gestartet haben, die eine beschäftigt Warte tut, um herauszufinden, „wenn 3 Minuten sind vergangen.“

... und dann, „leider zu allem viel schlimmer“, es wird versuchen, mit seiner Backup fortfahren, asynchron zu den Aktivitäten des „anderen Verfahrens“, dass es sein sollte ist sichern!

"Yuck!"

Warum nicht versuchen dies, stattdessen? Erfassen Sie einen Zeitstempel das ist "die Zeit der letzten Sicherung." Fügen Sie dann innerhalb Ihrer bestehenden while-Schleife Code hinzu, der diesen Zeitstempel mit der aktuellen Zeit vergleicht. War es mindestens 3 Minuten noch? Wenn ja, mach das Backup. (Ja, wird die Hauptschleife daher verzögert werden, bis die Sicherung abgeschlossen ist, aber, Sie wissen, dass das, was bekommt stauten stabil.)

Der Grund, dass ich Ihre Frage beantworten (stark) Ich schlage vor, dass eine Neugestaltung bedeutet, dass Ihre derzeitige Strategie sich hoffnungslos (!) in "Rassenbedingungen" verfangen wird. (Was Sie sehen, ist "nur die erste von ihnen.") Daher sage ich unverblümt, Sie: "Brücke" voraus! ("Gehen Sie nicht so. Drehen Sie zurück.")