2012-06-25 2 views
3

나는 멀티에 대해 배울 this link을 사용하고있다, 그러나 나는 두 번째 예제에 붙어 :다중 처리 란 무엇입니까? 프로세스 .__ 초기화 __ (자체)합니까?

import multiprocessing 
import time 

class Consumer(multiprocessing.Process): 

    def __init__(self, task_queue, result_queue): 
     multiprocessing.Process.__init__(self) 
     self.task_queue = task_queue 
     self.result_queue = result_queue 

    def run(self): 
     proc_name = self.name 
     while True: 
      next_task = self.task_queue.get() 
      if next_task is None: 
       # Poison pill means we should exit 
       print '%s: Exiting' % proc_name 
       break 
      print '%s: %s' % (proc_name, next_task) 
      answer = next_task() 
      self.result_queue.put(answer) 
     return 


class Task(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
    def __call__(self): 
     time.sleep(0.1) # pretend to take some time to do our work 
     return '%s * %s = %s' % (self.a, self.b, self.a * self.b) 
    def __str__(self): 
     return '%s * %s' % (self.a, self.b) 


if __name__ == '__main__': 
    # Establish communication queues 
    tasks = multiprocessing.Queue() 
    results = multiprocessing.Queue() 

    # Start consumers 
    num_consumers = multiprocessing.cpu_count() * 2 
    print 'Creating %d consumers' % num_consumers 
    consumers = [ Consumer(tasks, results) 
        for i in xrange(num_consumers) ] 
    for w in consumers: 
     w.start() 

    # Enqueue jobs 
    num_jobs = 10 
    for i in xrange(num_jobs): 
     tasks.put(Task(i, i)) 

    # Add a poison pill for each consumer 
    for i in xrange(num_consumers): 
     tasks.put(None) 

    # Start printing results 
    while num_jobs: 
     result = results.get() 
     print 'Result:', result 
     num_jobs -= 1 

첫째, 누군가가 multiprocessing.Process.__init__(self)가 않습니다 정확히 설명해주십시오 수 있을까? 또한 큐가 어떻게 작동하는지 완전히 모르겠다. 적어도 (명시 적으로 적어도 ... 명시 적으로 호출되지는 않지만) Consumer 클래스의 run 메서드가 어떻게 실행되는지 혼란 스럽다.

누군가가 나를 도울 수 있다면 주어진 출력을 얻기 위해 예제를 살펴보면 크게 감사 할 것입니다.

+0

아마도 [이 질문] (http://stackoverflow.com/questions/625083/python-init-and-self-what-do-they-do)이 도움이 될 수 있습니다. 나는 거의 당신의 복사본으로 그것을 제안합니다. – brandizzi

+0

@brandizzi 그 질문은 파이썬의'self'와'__init__'에 관한 근본적인 질문입니다. 여기서 OP의 질문은'__init__'가'다중 처리. 프로세스 .__ init __ (자체)'를 호출하는 이유입니다. –

답변

1

클래스의 개체가 만들어지면 해당 개체의 __init__() 메서드가 자동으로 호출되어 초기화됩니다. 두 번째 예에서 클래스 Consumermultiprocess.Process에서 상속받은 것으로 정의됩니다. 첫 번째로 Consumer을 초기화 할 때 기본 설정 인 Process을 초기화하여 실행 준비가되었는지 확인합니다. 많은 OO 언어와 달리 기본 클래스 __init__()은 Python에서 자동으로 호출되지 않습니다.

run() 메서드는 start()이 주 프로세스의 Consumer 개체에서 호출 될 때 자동으로 새 프로세스에서 호출됩니다. 문서의 내용은 multiprocessing입니다.

Queue은 여러 프로세스가 통신하는 방법입니다. 일반적으로 개별 프로세스는 서로의 데이터를 볼 수 없지만 Queue은 메시지를 앞뒤로 전달할 수 있습니다. 이 예제에서 주 프로세스는 여러 작업을 대기열에 넣고 다른 각 프로세스는 해당 대기열에서 작업을 가져 와서 수행하고 결과를 다른 대기열로 다시 보냅니다.

+0

감사합니다. __init __()가 프로세스에 대해 자동으로 호출되지 않았다는 것을 알지 못했습니다. 소비자가 더 많은 방법을 가지고 있다면 자동적으로 호출 될 것인가? – aensm

+0

아니요,'run()'은 특별합니다 - 문서를 읽으십시오. 'run()'에서 소비자의 다른 메소드를 명시 적으로 호출 할 수는 있지만 자동으로 호출되지는 않습니다. –

0

__init__은 클래스 생성자입니다. 더 많은 배경을 보시려면 here을 방문하십시오.

the docs에 따르면이 서브 클래스에서 호출해야합니다 : 서브 클래스의 생성자를 오버라이드 (override)

경우, 그것은 다른 작업을 수행하기 전에 기본 클래스 생성자 (. 공정 초기화을())를 호출 확인해야합니다 그 과정에

0

글쎄, 아마도 이것은 당신이 찾고있는 대답이 아닐지도 모른다. 그러나 나는 생각한다.

Process 개체는 만들 때 많은 힘든 작업을해야합니다. 나는 그것이 무엇을해야하는지 모른다. 그러나 나는 그것이 다른 운영체제 프로세스, 통신용 파이프 등을 만들어야한다는 것을 확실히 알고있다. 기본적으로이 모든 것들은 초기화 메소드에서 실행된다. (파이썬에서는, __init__()). 따라서 서브 워크를 Process으로 만들려면 부모에게 __init__() 메서드를 호출하여 프로세스가 필요로하는 모든 것을 초기화해야합니다. Consumer 클래스는 모두 Process의 모든 작업을 수행해야하므로 Process에있는 모든 항목이 있어야하며 __init__() 호출이이를 보장합니다.

무엇이 정확히입니다. 실제로는 관련이 없습니다. 그것은 __init__()과 같은 기존 방법의 요점입니다 : 그들은 당신을 위해 열심히 작업을 수행하고 당신은 단지 그것을 호출해야합니다.그래서, we could get deep into the Python source code to see what __init__() does,하지만 지금 당장 파이썬으로 시작하는 것 같아서 가장 좋은 대답은 __init__()은 알 필요가없는 많은 초기화 작업을 수행한다는 것입니다.

관련 문제