【建立自定義程序類】
- 繼承Process類
- 運作Process類的__init__以擷取父類屬性
- 重寫run方法,在通過自定義類生成對象後,調用start()會自動執行這個方法
示例:
from multiprocessing import Process
import time
class ClockProcess(Process):
def __init__(self, value):
# 使用父類的init保證同時擁有父類的屬性
super(ClockProcess, self).__init__()
# 以下方法也可以,直接調用父類
# Process.__init__(self)
self.value = value
# 自定義的類中,重寫run方法
def run(self):
for i in range(5):
print('The time is {}'.\
format(time.ctime()))
time.sleep(self.value)
# 用自己的類建立程序對象
p = ClockProcess(2)
# 會自動執行run方法
p.start()
p.join()
【多程序優缺點】
- 優點:
- 并行執行多個任務,提高效率
- 建立友善
- 運作獨立,不受其他程序影響
- 資料安全
-
缺點:
在程序的建立和删除過程中消耗計算機資源較多
【程序池】
-
産生原因:
如果有大量的任務需要多程序完成,則可能需要頻繁的建立和删除過程,給計算機帶來較多的消耗
-
使用:
大量可以短時間完成的任務需要多程序操作的時候比較适用于程序池
- 使用方法:
- 建立程序池,在池内放入适當的程序
- 将事件加入程序池隊列
- 程序事件不斷運作,直到所有事件運作完成
- 關閉程序池,回收程序
-
from multiprocessing import Pool
【Pool(processes)】
功能:建立程序池對象
參數:processes 表示程序池中有多少程序
對象:(傳回)程序池對象
【pool.apply_async(func,args,kwds)】
功能:(異步方式)将事件放入程序池等待執行
參數:
func:要執行的事件函數(要放入程序池的事件函數)
args:給func函數以元組傳參
kwds:給func函數以字典傳參
傳回值:
傳回一個事件對象 通過get()可以擷取事件函數的傳回值
【pool.apply(func,args,kwds)】
功能:(同步)将事件放入程序池等待執行(一個一個來)
參數:
func:要執行的事件函數(要放入程序池的事件函數)
args:給func函數以元組傳參
kwds:給func函數以字典傳參
傳回值:無
【pool.close()】
功能:關閉程序池 不能再添加新的事件
【pool.join()】
功能:回收程序池。(阻塞等待程序池退出(當所有事件處理完畢後))
參數:無
注意:先close,再join
【pool.map(func,iter)】
功能:
将要完成的事件放入到程序池
參數:
func:要完成的事件函數
iter:要給func傳遞的參數的疊代器
傳回值:
傳回事件函數的傳回值清單
- 示例:
from multiprocessing import Pool
from time import sleep
def worker(msg):
sleep(2)
print(msg)
# 建立程序池對像啟動4個程序
pool = Pool(processes=4)
for i in range(10):
msg = 'hello %d' % i
# 将事件加入到程序池
pool.apply_async(func=worker,args=(msg,))
# 關閉程序池
pool.close()
# 回收程序池
pool.join()
-----------------------------------------
hello 2
hello 1
hello 0
hello 3
hello 6
hello 4
hello 5
hello 7
hello 8
hello 9
(4個4個列印,程序池裡有4個程序.無序,看誰先搶占到時間片)
- 示例map
from multiprocessing import Pool
import time
def fun(n):
time.sleep(1)
print('執行pool map事件',n)
return n*n
pool = Pool(4)
r = pool.map(fun,range(6))
print('傳回值清單',r)
pool.close()
pool.join()
----------------------------------------------------------
執行pool map事件 0
執行pool map事件 3
執行pool map事件 2
執行pool map事件 1
執行pool map事件 4
執行pool map事件 5
傳回值清單 [0, 1, 4, 9, 16, 25]