2017-10-20 2 views
1

Ich erstelle derzeit eine Klasse, die einige Methoden in einer Multithread-Methode ausführen soll, mit dem multiprocessing Modul. Ich führe die echte Berechnung unter Verwendung einesvon n Arbeiter. Nun wollte ich jedem der aktuell n aktiven Arbeiter einen Index zwischen 0 und n für eine andere Berechnung zuweisen. Um dies zu tun, wollte ich eine gemeinsame Queue verwenden, um einen Index in einer Weise zuzuweisen, dass zu keinem Zeitpunkt zwei Arbeiter die gleiche ID haben. Um die gleiche Queue innerhalb der Klasse zwischen den verschiedenen Threads zu teilen, wollte ich es in einem Manager.Namespace() speichern. Aber dabei habe ich einige Probleme mit der Queue. Deshalb habe ich eine Minimalversion meines Problems erstellt und am Ende mit etwas wie folgt aus:Multiprocessing Queue innerhalb Manger.Namespace()

from multiprocess import Process, Queue, Manager, Pool, cpu_count 

class A(object): 
    def __init__(self): 
     manager = Manager() 
     self.ns = manager.Namespace() 
     self.ns.q = manager.Queue() 

    def foo(self): 
     for i in range(10): 
      print(i) 
      self.ns.q.put(i) 
      print(self.ns.q.get()) 
      print(self.ns.q.qsize()) 

a = A() 
a.foo() 

In diesem Code wird die Ausführung vor der zweiten Print-Anweisung - daher denke ich, dass keine Daten tatsächlich geschrieben in die Queue. Wenn ich die namespace verwandten Sachen entferne, funktioniert der Code einwandfrei. Ist das das beabsichtigte Verhalten der multiprocessing s Objekte und mache ich etwas falsch? Oder ist das eine Art Bug?

Antwort

2

Ja, Sie sollten Namespace hier nicht verwenden. Wenn Sie ein Queue Objekt in manager.Namespace() setzen, erhält jeder Prozess eine neue Queue Instanz, alle Writer/Reader dieser neu erstellten Queue-Objekte haben keine Verbindung zum übergeordneten Prozess, daher wird keine Nachricht von Worker-Prozessen empfangen. teilen Sie stattdessen nur eine Queue.

übrigens erwähnten Sie "Thread" viele Male, aber im Zusammenhang mit multiprocess Modul, ein Arbeiter ist ein Prozess, kein Thread.

Verwandte Themen