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()
