我一直在使用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 :(得分:1)
创建类的对象时,会自动调用其__init__()
方法来初始化它。在第二个示例中,类Consumer
被定义为继承自multiprocess.Process
。 Consumer
初始化时的第一件事是初始化其基础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__()
做了许多你不需要知道的初始化工作。