Wenn Sie wollen gemeinsame Daten lesen und ändern zwischen 2 Skripten, die separat laufen, wäre eine gute Lösung, die Vorteile des Python-Multiprocessing-Moduls zu nutzen und eine Pipe() oder eine Warteschlange() (siehe Unterschiede aquí ). Auf diese Weise können Sie Skripte synchronisieren und Probleme in Bezug auf Gleichzeitigkeit und globale Variablen vermeiden (z. B. was passiert, wenn beide Skripte gleichzeitig eine Variable ändern wollen).
Das Beste an der Verwendung von Pipes/Queues ist, dass man Python-Objekte durch sie hindurchleiten kann.
Außerdem gibt es Methoden, um das Warten auf Daten zu vermeiden, wenn diese noch nicht übergeben wurden ( Warteschlange.leer() y pipeConn.poll() ).
Nachstehend finden Sie ein Beispiel für die Verwendung von Queue():
# main.py
from multiprocessing import Process, Queue
from stage1 import Stage1
from stage2 import Stage2
s1= Stage1()
s2= Stage2()
# S1 to S2 communication
queueS1 = Queue() # s1.stage1() writes to queueS1
# S2 to S1 communication
queueS2 = Queue() # s2.stage2() writes to queueS2
# start s2 as another process
s2 = Process(target=s2.stage2, args=(queueS1, queueS2))
s2.daemon = True
s2.start() # Launch the stage2 process
s1.stage1(queueS1, queueS2) # start sending stuff from s1 to s2
s2.join() # wait till s2 daemon finishes
# stage1.py
import time
import random
class Stage1:
def stage1(self, queueS1, queueS2):
print("stage1")
lala = []
lis = [1, 2, 3, 4, 5]
for i in range(len(lis)):
# to avoid unnecessary waiting
if not queueS2.empty():
msg = queueS2.get() # get msg from s2
print("! ! ! stage1 RECEIVED from s2:", msg)
lala = [6, 7, 8] # now that a msg was received, further msgs will be different
time.sleep(1) # work
random.shuffle(lis)
queueS1.put(lis + lala)
queueS1.put('s1 is DONE')
# stage2.py
import time
class Stage2:
def stage2(self, queueS1, queueS2):
print("stage2")
while True:
msg = queueS1.get() # wait till there is a msg from s1
print("- - - stage2 RECEIVED from s1:", msg)
if msg == 's1 is DONE ':
break # ends loop
time.sleep(1) # work
queueS2.put("update lists")
EDIT : Ich habe gerade herausgefunden, dass man mit queue.get(False) um eine Blockierung beim Datenempfang zu vermeiden. Auf diese Weise muss nicht erst geprüft werden, ob die Warteschlange leer ist. Dies ist nicht möglich, wenn Sie Pipes verwenden.
7 Stimmen
Meinen Sie, dass Sie einen Wert in zwei völlig getrennten Python-Sitzungen gemeinsam nutzen wollen? Wenn ja, ist das nicht möglich, indem Sie einfach einen Wert in einem gemeinsamen Modul setzen.
0 Stimmen
Ich danke Ihnen. Im Moment bin ich dabei, ein drittes Modul zu erstellen, das beide importiert, so dass alles in der gleichen Sitzung geschieht. Die Pickle-Lösung funktioniert nicht ganz für mich, weil ich eine threading.Condition()-Variable in einem Modul setzen wollte (die wegen der impliziten Sperre nicht gepickt werden kann) und sie von beiden Sitzungen aus verwenden wollte. Und jetzt, wo ich darüber nachdenke, ist die Möglichkeit, die Variable gemeinsam zu nutzen, wahrscheinlich das geringste meiner Probleme, da ich nicht glaube, dass der Zustand in der Bedingungsvariable gemeinsam genutzt werden wird.
0 Stimmen
Ich bin auf diese Frage gekommen, als ich das gleiche Problem hatte. Dann habe ich über Steckdosen gelesen. Warum sollte man sie nicht verwenden?