2016-05-18 9 views
0

次のコードは、2つの子プロセス間の通信をキュー単位で示したものです。 self.q.qsize()がゼロで、self.q.get()が "ACT"関数でブロックされているのはなぜですか?....カウンタはキューがいっぱいであることを示しています。 ..このマルチプロセスの場合、キューが通信に使用できない理由

#!/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" 

答えて

0

multiprocessing.Queueを使用する必要があります。

Queue.Queueは、スレッディング用です。現在、各プロセスに別々のキューインスタンスを作成して使用しています。multiprocessing.Queueが提供するプロセス間通信を容易にするロジックはありません。

multiprocessing.QueueミラーQueue.Queue方法のほとんどが、あなたがあればOS Xの

+0

joinメソッド呼び出しとおそらくqsizeを削除する必要があります。しかしself.qは=キュー(1)は、クラスの初期化部分で宣言され、あなたは私が "pr"の2番目のプロセスを呼び出すと、このself.qはフォークですが、同じメモリを共有していませんか?真実がこのようなものではないなら、私にこの概念についてもっと助けてください... – puming

+0

@ PuMing.Z正解ですが、最初にコピーオンライトを使って特定のOSで同じメモリを共有するかもしれませんが、その他。 – Jared

+0

あなたはdeepcopyを意味しますか?私はあなたの助けに感謝します。私は今コーディングを続けています... ha – puming

関連する問題