2009-05-29 5 views
16

파이썬 큐 및 다중 처리 큐 : 어떻게 동작합니까?

이 샘플 코드는 작동합니다 (파일에 내용을 쓸 수 있습니다) :

from multiprocessing import Process, Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

대신이 다른 샘플은 없습니다 : (errormsg : '모듈'객체는 호출 할 수 없습니다.)

import Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

(나는 파일에 뭔가 쓸 수 없다) :

import Queue 

queue = Queue.Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

누군가가 그 차이점을 설명 할 수 있을까? 그리고 할 권리?

+2

사이드 노트 : "가져 오기 대기열에서 가져 오기"- 이렇게하면 처음 시도한 것처럼 Queue.Queue를 호출 할 수 있습니다. - "대기열()" – Bob

답변

46

두 번째 예에서는 이미 설명을했습니다. Queue은 호출 할 수없는 모듈입니다.

세 번째 예는 multiprocessing과 함께 Queue.Queue을 사용한다고 가정합니다. Queue.Queue은 프로세스간에 공유되지 않습니다. Queue.Queue이 프로세스 전에 선언되면 각 프로세스는 그 프로세스의 사본을 수신하게되며,이 프로세스의 사본은 다른 모든 프로세스와 독립적입니다. 자녀를 시작하기 전에 부모가 Queue.Queue에 올린 항목은 각 어린이에게 제공됩니다. 하위 항목을 시작한 후 부모가 Queue.Queue에 배치 한 항목은 상위 항목에서만 사용할 수 있습니다. Queue.Queue스레드간에 동일한 프로세스 (threading 모듈 사용) 사이의 데이터 교환을 위해 만들어졌습니다. 다중 처리 대기열은 다른 파이썬 프로세스 사이의 데이터 교환을위한 것입니다. API가 비슷해 보이지만 (근본적으로 그렇게 설계된) 기본 메커니즘은 근본적으로 다릅니다.

  • multiprocessing 큐는 개체를 산세 (직렬화)하여 파이프를 통해 데이터를 교환합니다.
  • Queue.Queue은 올바른 동작을 위해 스레드와 잠금/뮤텍스간에 공유되는 데이터 구조를 사용합니다.
+3

queueing.Queue 당신이 무엇을 넣어에 대한 참조를 얻을 것입니다 동안 넣을 복사하십시오. 내게이 완전히 설명서에서 명확하지 않았습니다. – Pelle