2012-03-22 3 views
1

an example with threads을 수정했으며 아래에 포함 된 다중 처리와 함께 예제를 얻었습니다. 내 문제는 ProduceToQueue 잘 실행되지만 ConsumeFromQueue 완료되지 않았습니다. 왜? 이 프로그램은 제 첫 번째 다중 처리 프로그램 중 하나입니다.이 생산자 소비자 코드에 어떤 문제가 있습니까?

from Queue import Queue 
import multiprocessing 
import random 
import time 


class ProduceToQueue(multiprocessing.Process): 
    def __init__(self, queue): 
     multiprocessing.Process.__init__(self) 
     self.shared_queue = queue 

    def run(self): 
     for i in range(11, 21): 
      time.sleep(random.randrange(5)) 
      print "%s adding %s to queue" % (self.name, i) 
      self.shared_queue.put(i) 

     print self.name, "finished producing values" 
     print "Terminating", self.name 


class ConsumeFromQueue(multiprocessing.Process): 
    def __init__(self, queue): 
     multiprocessing.Process.__init__(self) 
     self.shared_queue = queue 

    def run(self): 
     value = 0 
     current = 10 
     for i in range(10): 
      time.sleep(random.randrange(3)) 
      print "%s attempting to read %s..." % (self.name, current + 1) 
      current = self.shared_queue.get() 
      print "%s read %s" % (self.name, current) 
      value += current 

      print "%s retrieved values totaling: %d" % (self.name, value) 
      print "Terminating", self.name 


queue = Queue() 
producer = ProduceToQueue(queue) 
consumer = ConsumeFromQueue(queue) 

producer.start() 
consumer.start() 

producer.join() 
consumer.join() 

답변

1

는 프로세스 사이에 적절하게 공유하는 일이기 때문에 당신이 multiprocessing에서 Queue 클래스를 사용한다, 대신 threadingmultiprocessing를 사용하는 경우. 자세한 내용은 the Python docs on the multithreading module을 참조하십시오. 당신이 자식 프로세스를 만들 때마다 (Queue에서)

표준 Queue 클래스는 효과적으로 두 별도의 큐으로 분할됩니다. 즉, 사용자의 대기열이 메인 프로세스 (아무도 접촉하지 않음)에 있고 다른 대기열이 작성자 (작성 대상)에 있고 아직 다른 대기열에 있습니다. 읽기).

그리고이 세 가지 사이에는 아무런 관련이 없습니다.

from Queue import Queue 

로 :

from multiprocessing import Queue 

그래서 당신의 대기열이 올바른 유형의 것을 프로세스보다는 스레드 사이에 작동하는

가장 빠른 수정은 단순히 변경하는 것입니다. 아니면 아예 그 from 라인을 제거하고 사용하세요 : 또한

queue = multiprocessing.Queue() 

(I이 그냥 코드를 연주됩니다 실현하지만), 그것은 소비자의 수면 수술을하는 것은 매우 드문, 당신은 일반적으로 단지를 원하는 것 대기열에 항목이 나타날 때 대기 할 준비를하십시오.

+0

대단히 감사합니다. 아주 좋은 설명. –

3

Queue.Queue을 사용 중입니다. 다중 처리 작업을 위해서는 multiprocessing.Queue을 사용해야합니다.

+1

대단히 감사합니다. 코드가 정상적으로 실행 중입니다. –

관련 문제