1 模块简介
multiprocessing模块在Python2.6中引入。最初的multiprocessing是由Jesse Noller和Richard Oudkerk在PEP 371中定义。就像你可以在threading模块中使用多个线程一样,multiprocessing模块允许你使用多个进程。当你使用多个进程时,你可以避免GIL锁,并充分利用机器的多处理器。

multiprocessing库包括一些没有在threading模块中出现的API。例如,你可以使用Pool类在多个输入上并行执行一个函数。我们将在后面的章节提到Pool。我们先从multiprocessing中的Process类开始。

2 模块使用
2.1 开始使用Multiprocessing

Process类与threading中的Thread类非常相似。让我们尝试着创建多个进程,这些进程都会调用同一个函数,让我们看看它们是如何工作的,

import os

from multiprocessing import Process

def doubler(number):
    result = number * 2
    proc = os.getpid()
    print("{0} double to {1} by process id:{2}\n".format(number,result,proc))

if __name__ == "__main__":
    numbers = [5,10,15,20,25]
    procs = []
    for index,number in enumerate(numbers):
        proc = Process(target = doubler,args = (number,))
        procs.append(proc)
        proc.start()
    for proc in procs:
        proc.join()
这个例子中,我们引入Process,然后创建一个doubler函数。在doubler函数中,我们将传入的数乘以2。我们也使用Python的os模块用于获取当前进程的ID(或者为pid)。这将会告诉我们哪个进程正在调用函数。在代码的底部,我们创建了多个线程,并且启动它们。最后一个循环就是在每个进程上调用join()方法,这个将会告诉Python需要等待进程终止。如果你需要终止终止一个进程,你可以调用terminate()方法。

当你运行这段代码时,你将会看到与以下结果相似的信息,

5 double to 10 by process id:6725

10 double to 20 by process id:6726
20 double to 40 by process id:6728
15 double to 30 by process id:6727



25 double to 50 by process id:6729
有时候,拥有人类可读的名字的进程会更加方便。幸运的是,Process类允许你获取进程的名字,实例如下,

import os

from multiprocessing import Process,current_process

def doubler(number):
    result = number * 2
    proc_name = current_process().name
    print("{0} double to {1} by process id:{2}\n".format(number,result,proc_name))

if __name__ == "__main__":
    numbers = [5,10,15,20,25]
    procs = []
    proc = Process(target = doubler, args = (5,))
    for index,number in enumerate(numbers):
        proc = Process(target = doubler,args = (number,))
        procs.append(proc)
        proc.start()