python关于multiprocessiong.Pool进程池使用

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

map, apply, map_async, apply_async

四种方法的区别如下:

简单来说:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章