2016-05-18 13 views
0

Der folgende Code bezieht sich auf die Kommunikation zwischen zwei untergeordneten Prozessen durch die Warteschlange. Ich kann nicht herausfinden, warum die self.q.qsize() Null ist und self.q.get() ist in der Funktion "ACT" blockiert .... .... Da der Zähler zeigt, ist die Warteschlange voll. ..warum die Warteschlange für die Kommunikation in diesem Multiprozess-Fall nicht funktioniert

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from multiprocessing import Process 
import multiprocessing 
import time 
from Queue import Queue 

class Test(): 
    def __init__(self): 
     self.q = Queue(1) 

    def ACT(self): 
     while True: 
      print "B momoent queue size: %s" %self.q.qsize() 
      print self.q.get() 
      time.sleep(1) 

    def counter(self): 
     for i in range(5,10): 
      if not i == 5: 
       print "Hello1" 
      print self.q.full() 
      self.q.join() 
      print "Hello2" 
      self.q.put(str(i)) 
      print "A moment queue size: %s" % self.q.qsize()   
if __name__ == '__main__': 

    foo = Test() 
    qw = Process(target=foo.counter) 
    qw.start() 

    qr = Process(target=foo.ACT) 
    qr.start() 

    qw.join() 
    print "End" 

Antwort

0

Sie müssen multiprocessing.Queue verwenden.

Queue.Queue ist für die Verwendung von Threads gedacht. Derzeit erstellen und verwenden Sie separate Warteschlangeninstanzen in jedem Prozess. Es gibt keine Logik, die die Kommunikation zwischen Prozessen erleichtert, die multiprocessing.Queue bietet.

multiprocessing.Queue Spiegel meisten Queue.Queue Methoden, aber Sie werden join Methodenaufruf und möglicherweise qsize wenn auf OS X.

+0

Aber die self.q = Queue (1) erklärt im Init-Teil der Klasse entfernen haben, und du meinst, wenn ich den zweiten Prozess für "pr" nenne, ist dies self.q ist Gabel, aber nicht teilen die gleiche Erinnerung? Wenn die Wahrheit nicht so ist, bitte geben Sie mir weitere Hilfe zu diesem Konzept ... – puming

+0

@ PuMing.Z Korrekt, während es den gleichen Speicher auf bestimmten Betriebssystemen zunächst per Copy-on-Write teilen kann, ändert man nicht die andere. – Jared

+0

Sie meinen die Deepcopy? Ich freue mich für Ihre Hilfe zu diesem Thema. Ich schreibe jetzt weiter ... ha – puming