6 Stimmen

python singleton in multiprocessing

Wie kann ich kodieren, um dieselbe Instanz einer "singletonischen" Klasse zwischen Prozessen zu teilen?

8voto

Alex Martelli Punkte 805329

Jeder andere Prozess, der Zugriff auf diese Instanz benötigt, erhält sie, indem er über eine Warteschlange (wie vom Multiprocessing-Modul bereitgestellt) oder andere IPC-Mechanismen zur Nachrichtenübermittlung Nachrichten an den besitzenden Prozess sendet und über ähnliche Mechanismen Antworten erhält.

5voto

Der Sinn von Prozessen ist es, unterschiedliche Adressräume zu haben. Wenn Sie Informationen zwischen Prozessen austauschen wollen, müssen Sie einige Mittel verwenden, um Interprozesskommunikation .

2voto

dar Punkte 6403

Ich glaube nicht, dass Sie die Instanz zwischen den Prozessen teilen können, aber Sie können die Instanz auf gemeinsamen Speicher zugreifen lassen: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes um seinen Zustand zu kontrollieren, wenn Sie das wirklich wollen.

Wie bereits in anderen Antworten erwähnt, könnte es jedoch einfacher sein, mit einer Warteschlange zu erreichen, was Sie wollen.

1voto

Eli Courtwright Punkte 174547

In Python 2.6 wird die multiprocessing Modul hat eine Value Objekt verwendet für gemeinsame Nutzung von Zuständen zwischen Prozessen . Sie haben ein Codebeispiel, das Ihnen eine Vorstellung davon vermittelt, wie man den Zustand auf diese Weise gemeinsam nutzt, und Sie können diesen Ansatz beim Schreiben einer Singleton-Klasse verwenden.

1voto

CpILL Punkte 5169

Sie können auch eine der multiprocessing.manager gemeinsam nutzbare Datentypen

import multiprocessing as mp
manager = mp.Manager()
shared_list = manager.list()

def worker1(l):
    l.append(1)

def worker2(l):
    l.append(2)

process1 = mp.Process(target=worker1, args=[shared_list])
process2 = mp.Process(target=worker2, args=[shared_list])

process1.start()
process2.start()
process1.join()
process2.join()

print shared_list

würde die Ausgabe wie folgt aussehen:

[1, 2]

Es gibt eine Vielfalt der Datenstrukturen anbieten, aber Sie brauchen den übergeordneten Prozess, um das gemeinsame Objekt an die untergeordneten Objekte weiterzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X