python 多進程-進階-進程池

    如果需要啓動大量的子進程,使用進程池批量創建子進程的方式更加常見,因爲當被操作對對象數目不大時,可以直接利用multiprocessing中的Process動態生成多個進程,如果數量大,此時就應該使用Pool。

    Pool 可以提供指定數量的進程供用戶調用,默認大小是CPU的核數。當有新的請求提交到Pool中時,如果池還沒有滿,就會創建一個新的進程用來執行該請求;但是如果池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,纔會創建新的進程來處理他,示例:

# -*- coding: utf-8 -*-
# User: jier
# QQ: 2276845534
from multiprocessing import Pool
import os, time, random


def run_task(name):
    print('Task %s (pid = %s) is running...' % (name, os.getpid()))
    time.sleep(random.random() * 3)
    print("Task %s end." % name)


if __name__ == "__main__":
    print('Current process %s.' % os.getpid())
    p = Pool(processes=3)
    for i in range(5):
        p.apply_async(run_task, args=(i, ))
    print("Waiting for all subprocesses done...")
    p.close()
    p.join()
    print('All subprocesses done.')

    代碼執行完畢輸入結果如下:

Current process 15160.
Waiting for all subprocesses done...
Task 0 (pid = 8392) is running...
Task 1 (pid = 9488) is running...
Task 2 (pid = 22604) is running...
Task 0 end.
Task 3 (pid = 8392) is running...
Task 1 end.
Task 4 (pid = 9488) is running...
Task 2 end.
Task 4 end.
Task 3 end.
All subprocesses done.

Process finished with exit code 0

    從上面可以看到,上述進程先創建了容量爲3的進程池,依次向進程池中添加了5個任務。從運行結果中可以看到雖然添加了5個任務,但是一開始只運行了三個,而且每次最多運行三個進程。當一個任務結束了,新的任務依次添加進來,任務執行使用的進程依然是原來的進程,可以通過進程的PID看出來。

    PS:Pool對象調用join() 方法會等待所有子進程執行完畢,調用join() 之前必須先調用close(),調用close() 之後就不能繼續添加新的process了。

 

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