大家都知道使用多核 CPU 进行并行处理,无需更快 CPU ,通过并行处理可以让程序在短时间内进行更多的计算。
在今天无论是大数据还是机器学习都面临着大量的运算,并行处理让我们能够利用多核 CPU 以及擅长处理高度并行问题的 GPU 来解决这些问题。
一个问题的各个子单元是完全彼此独立。
分布式内存
在共享内存中,各个子单元可访问相同的内存空间。这种方法的优点在于,无须显式地处理信号。
线程生成多个执行上下文并共享内存空间。而进程提供多个执行上下文,有自己的内存空间,因此必须显式地处理信号。
Python 能够生成并处理线程,但使用线程不能改善性能。由于 Python 解释器的设计,每次只能运行一个 Python 指令,这种机制称为全局解释器(GIL)
使用多个进程
标准模块 multiprocessing 可用来生成多个进程,以快速并行化简单任务,同时避免 GIL 问题。
Process 和 Pool 类
multiprocessing.Process 派生出子类。通过扩展方法 init 来初始化资源,还可以通过实现方法 Process.run 来编写将在子进程中执行的代码。
要创建独立运行的进程,可从
import multiprocessing
import time
class Process(multiprocessing.Process):
def __init__(self,id):
super(Process, self).__init__()
self.id = id
def run(self):
time.sleep(1)
print("I'm the process with id: {}".format(self.id))
要生成进程,必须实例化 Process 类并调用方法 Process.start 而不是 run 方法。Process.start 后代码将立即执行,而不是等待 p 结束后再执行。
p = Process(0)
p.start()
p = Process(0)
p.start()
print("hello")
hello
I'm the process with id: 0
从输出来看 print 并没有等待任务执行完毕再执行,所以先输出 hello 而后输出 run 中的代码,如果想要等待任务执行完毕后在执行 print 可以使用 p jion 方法来实现。
p = Process(0)
p.start()
p.join()
print("hello")
I'm the process with id: 0
hello