通過實現process類來建立:process(group=none,target=none,name=none,args=(),kwargs={})
引數說明:target:表示這個程序例項所呼叫物件;
args:表示呼叫物件的位置引數元組;
kwargs:表示呼叫物件的關鍵字引數字典;
name:為當前程序例項的別名;
group:大多數情況下用不到;
process類常用方法:
is_alive():判斷程序例項是否還在執行;
join([timeout]):是否等待程序例項執行結束,或等待多少秒;
start():啟動程序例項(建立子程序);
run():如果沒有給定target引數,對這個物件呼叫start()方法時,就將執行物件中的run()方法;
terminate():不管任務是否完成,立即終止;
from multiprocessing import process
import os
defrun
(name,height=0,weight=0):
print("process %s:%s,height:%s,weight:%s"% (name, os.getpid(), height, weight))
if__name__ == '__main__':
for i in range(8):
p = process(target=run, args=(str(i),), kwargs=)
print('process will start')
p.start()
p.join()# 實現程序的同步,等待最後子程序結束,如果不加的這個語句可能會出現主程序結束而子程序沒有結束,因為主程序結束導致未完成的主程序結束
print('process end')
multiprcessing 提供了 pool類來代表程序池物件,pool 可以提供指定的程序提供使用者呼叫,預設是cpu的核數。但有新的請求提交到pool時 如果池沒有滿,就建立,如果滿了,就會等待,直到有程序結束,才會建立新的程序來處理.pool(processes=none,initializer=none,initargs(),maxtasksperchild=none,context=none)
引數說明:
processes:程序池最大個數,如果是none,通過返回的數字os.cpu_count()被使用(預設是cpu的核數)
initializer:如果不是none,那麼將在將啟動每個工作程序時呼叫initializer( initargs)。*
maxtasksperchild:乙個工作程序在它退出之前完成的任務的數量,被乙個新的工作 程序所取代,從而使未使用的資源得到釋放,預設的maxtasksperchild是none,這意味著工作程序將與池一樣長
(允許在池內的工作程序在退出前只完成一定數量的工作,然後進行清理,並生成新的程序來替換舊的工作)
context:可以用來指定啟動工作程序所用的上下文。通常,池是使用函式multiprocess. pool()或上下文物件的pool()方法建立的。在這兩種情況下都適當地設定了上下文。
常用方法:
map(func,iterable[,chunksize]):
乙個類似於map()內建函式的等價函式(它只支援乙個可迭代的引數)。它會使程序阻塞與此直到結果返回 ,返回列表,該方法將迭代分成若干塊,並將其提交到程序池作為單獨的任務。這些塊的(大約)大小可以通過將chunksize設定為乙個正整數來指定。
map_async(func, iterable[, chunksize[, callback]])
與map用法一致,但是它是非阻塞的。可以同過返回結果.get()得到程序池返回結果列表
close()
關閉程序池(pool),使其不在接受新的任務。
terminate()
結束工作程序,不在處理未處理的任務。
join()
主程序阻塞等待子程序的退出,join方法必須在close或terminate之後使用。
from multiprocessing import pool
import os,time,random
defrun
(name):
print('prcess%s(%s)'% (name,os.getpid()))
time.sleep(random.random()*3)
print('end %s'% name)
return name
defrun1
(): print(1);
if __name__ == '__main__':
args = (10, 20, 30)
list = [1,2,3,4,5,6,7,8,9,10,11]
p = pool(processes=4,initializer=run1,)
result = p.map_async(run,list)
p.close()
p.join()
print('-'*80)
結果
上面的兩個結果可以看出每個程序啟動前會呼叫initializer函式,當我設定maxtasksperchild=2的時候可以看出每個程序完成2次任務會被新的程序替代
Python 程序 執行緒 協程
程序和執行緒之間的關係 執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊 如程式計數...
Python 程序,執行緒, 協程
程序是系統進行資源分配和排程的乙個獨立單位 最小單位 程序的幾個狀態 空 新建 建立執行乙個程式的新程序,可能的事件有 新的批處理作業 互動登入 終端使用者登入到系統 作業系統因為提供一項服務而建立 由現有的程序派生等。新建 就緒 作業系統準備好再接納乙個程序時,把乙個程序從新建態轉換為就緒態。就緒...
執行緒程序以及協程的區別
程序,儲存在硬碟上的程式執行之後,會在記憶體裡形成乙個獨立的記憶體體,這個記憶體體有自己獨立的位址空間,有自己的堆,上級掛靠單位是作業系統,作業系統會以程序為單位分配系統資源 cpu時間片,記憶體等資源 程序是資源分配的最小單位。執行緒也成為輕量級執行緒,是作業系統排程 cpu排程 執行的最小單位 ...