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

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