九. 併發編程 (進程管道)

一 .進程(Pipe 雙管道通訊)python

1.進程管道概念(Pipe)安全

管道: 是python多進程中一種交換數據的方式 
multiprocessing.Pipe()則能夠雙向通訊

                                                                                             

2.管道使用(Pipe)dom

from multiprocessing import Pipe
from multiprocessing import Process
conn1,conn2=Pipe()
conn1.send("你好哈哈哈")
print(conn2.recv()) # 你好哈哈哈
進程之間通訊 方法1

def show (conn1): print("子進程")# 子進程 conn1.send("你好呀哈哈哈哈哈哈哈") if __name__ == '__main__': print("主進程!!!!!!!!!!!!") conn1,coon2=Pipe() p1= Process(target=show,args=(conn1,)) p1.start() print(coon2.recv()) # 你好呀哈哈哈哈哈哈哈 # 執行順序 # 主進程!!!!!!!!!!!! # 子進程 # 你好呀哈哈哈哈哈哈哈
進程之間通訊 方法2

def show (conn2): print("子進程") # 子進程 aa=conn2.recv() print(aa) # 你好世界!!!!!! if __name__ == '__main__': print("主進程!!!!!!!!!!!!") conn1,coon2=Pipe() conn1.send("你好世界!!!!!!") p1= Process(target=show,args=(coon2,)) p1.start() # 執行順序 # 主進程!!!!!!!!!!!! # 子進程 # 你好世界!!!!!!
進程之間通訊 方法3

def show (conn1): while True: msg=conn1.recv() if msg is None:break # 若是沒有明確條件 就會阻塞到這裏(死循環) 程序就結束不了 print(msg) if __name__ == '__main__': print("主進程!!!!!!!!!!!!") conn1,coon2=Pipe() p1= Process(target=show,args=(conn1,)) p1.start() for i in range(10): coon2.send("你好鴨阿嘎嘎嘎") coon2.send(None) # 若是沒有明確條件 就會阻塞到這裏(死循環) 執行結果: 主進程!!!!!!!!!!!! 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 進程已結束,退出代碼 0
# 進程之間通訊方法四 
def show (conn1,coon2):#一個發送 conn2 一個接收 conn1 coon2.close() while True: try: msg=conn1.recv() print(msg) except EOFError: conn1.close() break if __name__ == '__main__': print("主進程!!!!!!!!!!!!") conn1,conn2=Pipe() # 能夠把這兩個對象傳給子進程 一個發送 conn2 一個接收 conn1 p1= Process(target=show,args=(conn1,conn2)) p1.start() conn1.close() for i in range(10): conn2.send("你好鴨阿嘎嘎嘎") conn2.close() 執行結果: 主進程!!!!!!!!!!!! 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 你好鴨阿嘎嘎嘎 進程已結束,退出代碼 0

圖文說明

 3.使用管道來實現生產者消費者(Pipe)異步

pipe數據不安全 (搶佔資源)
IPC 進程通訊
from multiprocessing import Pipe from multiprocessing import Process import time,random # 消費者 def conm(con,pro,name): pro.close() while True: try: food=con.recv() print('%s吃了%s'%(name,food)) time.sleep(random.randint(1,5)) except EOFError: con.close() break # 生產者 def prod(con,pro,name,food): con.close() for i in range(20): time.sleep(random.randint(1,5)) f="%s生產%s個數%d"%(name,food,i) pro.send(f) pro.close() if __name__ == '__main__': print("主進程!!!!!!!!!!!!") con,pro=Pipe() p1= Process(target=prod,args=(con,pro,"張三","饅頭")) p2 = Process(target=conm, args=(con,pro,"老鼠")) p1.start() p2.start() con.close() pro.close()

圖文說明

# 枷鎖來控制管道行爲 來避免進程之間搶佔數據形成數據不安全現象
注意異步搶佔資源 因此加鎖來控制行爲 同步
from multiprocessing import Pipe from multiprocessing import Process,Lock import time,random # 消費者 def conm(con,pro,name,lock): pro.close() while True: lock.acquire() food=con.recv() lock.release() if food is None: con.close() break print('%s吃了%s' % (name, food)) # 生產者 def prod(con,pro,name,food): con.close() for i in range(20): time.sleep(random.randint(1,3)) f="%s生產了%s,%s"%(name,food,i) pro.send(f) pro.send(None) pro.send(None) pro.send(None) pro.close() if __name__ == '__main__': print("主進程!!!!!!!!!!!!") lock=Lock() con,pro=Pipe() # 生產者 p1= Process(target=prod,args=(con,pro,"張三","饅頭")) # 消費者 p2 = Process(target=conm, args=(con,pro,"老鼠", lock)) p3 = Process(target=conm, args=(con, pro, "母雞", lock)) p1.start() p2.start() p3.start() con.close() pro.close()
相關文章
相關標籤/搜索