2017-10-20 7 views
1

multiprocessing 모듈을 사용하여 멀티 스레드 방식으로 일부 메소드를 실행해야하는 클래스를 현재 작성 중입니다. nPool을 사용하여 실제 계산을 실행합니다. 이제 다른 계산을 위해 현재 n 활성 근로자 각각에게 0n 사이의 색인을 할당하려고했습니다. 이렇게하려면 인덱스를 할당하기 위해 공유 된 Queue을 사용하고 싶었습니다. 즉, 두 명의 작업자가 동일한 ID를 가질 때마다 인덱스를 할당했습니다. 서로 다른 스레드간에 클래스 내에서 동일한 Queue을 공유하려면 Manager.Namespace() 안에 저장하고 싶습니다. 하지만 이렇게하면 Queue에 몇 가지 문제가 있습니다. 따라서, 나는 내 문제의 최소 버전을 생성하고이 같은 뭔가 결국 :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() 

이 코드에서, 실행은 두 번째 인쇄 문 앞에 정지 - 그러므로, 나는 데이터가 실제로 작성되지 않는다는 생각 Queue. namespace 관련 항목을 제거하면 코드가 완벽하게 작동합니다. 이것은 multiprocessing 객체의 의도 된 동작입니까? 제가 잘못하고 있습니까? 아니면 어떤 종류의 버그입니까?

답변

2

예, 여기서는 Namespace을 사용하지 마십시오. Queue 개체를 manager.Namespace()에 넣으면 각 프로세스에 새로운 Queue 인스턴스가 생기고 새로 만든 대기열 개체의 모든 작성자/판독기는 부모 프로세스와 연결되지 않으므로 작업자 프로세스에서 메시지를받지 못합니다. 그 대신에 Queue을 공유하십시오.

그런데 "스레드"를 여러 번 언급했지만 모듈 multiprocess의 컨텍스트에서 작업자는 프로세스가 아니라 스레드입니다.