如果需要啟動大量的子程序,使用程序池批量建立子程序的方式更加常見,因為當被操作對物件數目不大時,可以直接利用multiprocessing中的process動態生成多個程序,如果數量大,此時就應該使用pool。
pool 可以提供指定數量的程序供使用者呼叫,預設大小是cpu的核數。當有新的請求提交到pool中時,如果池還沒有滿,就會建立乙個新的程序用來執行該請求;但是如果池中的程序數已經達到規定最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來處理他,示例:
# -*- coding: utf-8 -*-
# user: jier
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):
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了。
python多程序之程序池
在利用python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多台主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數量卻又太過繁瑣,此時可以...
Python多程序 程序池pool
from multiprocessing import process,pool import time defselect time.sleep 1 print time.ctime return 這是每個進行執行完後返回的值,該值會會被 callback函式接收 def foo args pri...
Python 多程序與程序池
fork方法是呼叫一次,返回兩次,原因在於作業系統將當前程序 父程序 複製出乙份程序 子程序 這兩個程序幾乎完全相同,於是fork方法分別在父程序和子程序中返回。子程序中永遠返回0,父程序中返回的是子程序的id。importos if name main print current process ...