Parallel programming is easy, as long as you don’t care about the performance.
为什么要用multiprocessing这个module
- 因为threading库是线性处理的,等于没有并行
- 有些计算处理工作很明显是重复劳动,甚至其元素顺序都不重要(比如:产生随机10个数返回其的相关计算结果)
- 没有时间将耗时部分用C/C++/Fortran重写,降低开发周期
缺陷
如果参数很多,很大,那么传递参数(pool的初始化)需要花费较长时间。
Pool: imap_unordered(func,arg,chunksize)
- func 可以是一个class的method (i.e. func=class.method)
- 作为imap,返回的是一个迭代器,可以给并行过程加进度条
- chunksize是指将整个任务分块处理时块的大小,每个process一次做chunksize个任务,全部处理完成后集中给迭代器输出(仍然是一个一个返回,而不是一次返回一个chunksize大小的list)。分配任务给process时也是以chunksize为单位分配。
实操验证(benchmarking)
假设某个计算任务要执行N=200次,使用计算机上的4个空闲的核。
我们将顺序(单核)执行的耗时作为Baseline: 205 s
chunksize | N | N/4 | N/5 | N/8 | N/10 | N/20 |
---|---|---|---|---|---|---|
imap_unordered | 225 s | 199 s | 174 s | 186s | 204 s | 281 s |