multiprocessiong.Pool多进程池中,可以使用的并行方法有:

map, apply, map_async, apply_async

四种方法的区别如下:

python manage 多进程通信 python 多进程 map_python manage 多进程通信

简单来说:

map(map_async) 与 apply(apply_async)的区别是:apply可以在循环中传递多种参数,map只支持一种迭代器的参数

apply与apply_async的区别:apply会在执行每一个进程的过程中阻塞,就是每读取一次参数执行一次,等到执行结束再读取下一个参数;async表示异步进行,apply_async会将所有参数读入内存并返回,在子进程执行时再阻塞。

下面通过实验说明:

# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random


def worker(i):
    # random.random()随机生成0~1之间的浮点数
    time.sleep(1)
    print(i)


if __name__ == '__main__':
    start = time.time()
    po = Pool(3)  # 定义一个进程池,最大进程数3
    for i in range(0, 10):
        # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply(worker, (i,))
    end = time.time()
    print("----循环耗时----:"+str(end-start))
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    end2 = time.time()
    print("-----进程耗时-----:"+ str(end2-start))

    start = time.time()
    po = Pool(3)  # 定义一个进程池,最大进程数3
    for i in range(0, 10):
        # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker, (i,))
    end = time.time()
    print("----循环耗时----:"+str(end-start))
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    end2 = time.time()
    print("-----进程耗时-----:" + str(end2-start))

    start = time.time()
    po = Pool(3)  # 定义一个进程池,最大进程数3
    # for i in range(0, 10):
        # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
        # 每次循环将会用空闲出来的子进程去调用目标
    po.map(worker, [i for i in range(10)])
    end = time.time()
    print("----循环耗时----:"+str(end-start))
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    end2 = time.time()
    print("-----进程耗时-----:"+ str(end2-start))

    start = time.time()
    po = Pool(3)  # 定义一个进程池,最大进程数3
    # for i in range(0, 10):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.map_async(worker, [i for i in range(10)])
    end = time.time()
    print("----循环耗时----:" + str(end - start))
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    end2 = time.time()
    print("-----进程耗时-----:" + str(end2 - start))

执行结果:

0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 ----循环耗时----:10.227928638458252
 -----进程耗时-----:10.324309349060059
 ----循环耗时----:0.022059917449951172
 0
 2
 1
 3
 5
 4
 6
 8
 7
 9
 -----进程耗时-----:4.296982288360596
 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 ----循环耗时----:4.203247785568237
 -----进程耗时-----:4.285009384155273
 ----循环耗时----:0.016041994094848633
 1
 0
 2
 3
 4
 5
 7
 6
 8
 9
 -----进程耗时-----:4.283062696456909