day32 通道 資料共享 程序池
阿新 • • 發佈:2018-11-29
1、管道
格式:
conn1,conn2 = Pipe()
管道的兩端可以進行全雙工通訊 如圖
程序2建立了管道,它就擁有管道兩端的資訊,每個端點都能收發資訊,它把端點資訊傳給程序1和程序3 ,它們之間就能實現相互通訊了
只要有通道兩個端點的資訊就可以實現兩個程序之間的通訊(前提是這兩個程序擁有的端點資訊不是同一個端點,同一個端點是不能在兩個程序之間進行收和發的,會報錯)
2、資料共享
格式:
m = Manager()
dic = m.dict( { "num" : 2 } )
資料共享會有資料安全的問題,使用的時候一般要加鎖
3、程序池
格式:
pool =Pool(4) #開的程序數一般是電腦的核心數,幾核就來幾個
pool.map(task,iterable) #非同步提交任務,字典close+join的效果
res = pool.apply(task,args=(,)) #同步提交任務,可以直接返回值
res = pool.apply_async(task,args =(,)) #非同步提交任務 ,返回的是一個物件,用get()方法可以從返回物件中取值,使用get()時有阻塞效果,不受到值不往下執行
如果要等非同步程序結束可以用pool.close() 和 pool.join() ,close表示的是鎖住程序池,不讓再往裡加任務
#回撥函式
程序池非同步方法才有的功能
pool.apply_async(task,args=(,),callback =fun)
回撥函式在父程序執行,所以才叫回調嘛,子程序回父程序調函式