3

我一直在使用此链接来了解多处理,但我被困在第二个示例中:

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)吗?另外我不完全确定队列是如何工作的,我很困惑消费者类中的 run 方法是如何执行的,即使它从未被调用过(至少明确地......)

如果有人可以帮助我完成示例以获得给定的输出,将不胜感激。

4

3 回答 3

1

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

当在主进程的对象上调用该run()方法时,会在新进程中自动调用该方法。那是在多处理文档中。start()Consumer

Queue就是多个进程通信的方式。通常,单独的进程不能看到彼此的数据,但Queue可以让它们来回传递消息。在这个例子中,主进程将几个任务放入一个队列中,其他每个进程将从该队列中拉出一个任务,执行它,并将结果发送回另一个队列。

于 2012-06-25T20:04:39.107 回答
0

__init__是一个类构造函数。在这里查看更多背景信息。

根据文档,这必须在子类中调用:

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

于 2012-06-25T20:00:56.460 回答
0

好吧,这可能不是您正在寻找的答案……但我认为这是最好的答案。

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

实际上,它究竟做了什么是无关紧要的这就是现有方法的全部意义,例如__init__():它们为您执行艰苦的工作,您只需调用它。所以,我们可以深入了解 Python 源代码,看看它做了什么__init__()但对于现在似乎正在开始使用 Python 的你来说,最好的答案是它__init__()做了很多你不需要知道的初始化工作。

于 2012-06-25T20:11:38.937 回答