multiprocessing.Process .__ init __(self)做什么?

时间:2012-06-25 19:58:51

标签: python multiprocessing init

我一直在使用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方法,即使它从未被调用(至少明确地......)

如果有人可以帮助我通过示例来获得给定的输出,那将非常感激。

3 个答案:

答案 0 :(得分:1)

创建类的对象时,会自动调用其__init__()方法来初始化它。在第二个示例中,类Consumer被定义为继承自multiprocess.ProcessConsumer初始化时的第一件事是初始化其基础Process,以确保它已准备好运行。与许多OO语言不同,基类__init__()函数不会在Python中自动调用。

在主进程中的run()对象上调用start()时,将在新进程中自动调用Consumer方法。这是multiprocessing文档中的内容。

Queue是多个进程通信的方式。通常,单独的流程无法看到彼此的数据,但Queue允许他们来回传递消息。在此示例中,主进程将多个任务放入队列,其他每个进程都将从该队列中提取任务,执行该任务,然后将结果发送回另一个队列。

答案 1 :(得分:0)

__init__是一个类构造函数。看看here了解更多背景信息。

根据the docs,必须在子类中调用它:

  

如果子类重写构造函数,它必须确保它在对进程执行任何其他操作之前调用基类构造函数(Process。 init ())。

答案 2 :(得分:0)

嗯,这可能不是你想要的答案......但我认为是最好的答案。

Process对象在创建时会产生很多困难。我不知道它应该做什么,但我相当确定它应该创建另一个操作系统进程,通信管道等。默认情况下,所有这些东西都在初始化方法中执行(在Python中,叫__init__())。因此,如果您创建Process的子升级,则应调用父__init__()方法来初始化流程所需的所有内容。由于您的Consumer课程应该执行Process所做的所有操作,因此它应该包含Process所具有的所有内容,并且__init__()调用可以保证它。

完全它实际上是无关紧要的。这就是现有方法的重点,例如__init__():它们为您执行艰苦的工作,您只需要调用它。所以,we could get deep into the Python source code to see what __init__() does,但是对于你来说,现在似乎是从Python开始,最好的答案是__init__()做了许多你不需要知道的初始化工作。