进程 互斥锁、队列与管道、生产者消费者模型
生活随笔
收集整理的這篇文章主要介紹了
进程 互斥锁、队列与管道、生产者消费者模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 1.互斥鎖
- 2.隊列與管道
- 3.生產者消費者模型(Queue)
- 4.生產者消費者模型(JoinableQueue)
1.互斥鎖
- 首先導入Lock模塊
- 實例化一把鎖
- 但是每次生成子進程的時候都會重新實例化一把鎖,我們的目的是想讓所有的子進程使用同一把鎖,所以需要把鎖傳遞給子進程在使用 鎖名.acquire():開鎖->所有子進程開始搶位置 鎖名.release():關鎖->位置排好了,開始執鎖起來執行.
- join與互斥鎖的區別:join是把所有的子進程代碼變為串行的,而互斥鎖則可以規定那幾行代碼變為串行
2.隊列與管道
- 互斥鎖是基于硬盤資源的
- 隊列和管道是基于內存的,multiprocessing模塊提供了這個處理操作,也就是IPC,基于網絡間進程通信的方式
- 隊列是管道和鎖的結合
- 隊列需要遵守先進先出算法
- 還有就是就算不控制隊列大小,他之后也會往里面塞數據
- 隊列里面是放小數據的,不可以放類似視頻的這種大數據
3.生產者消費者模型(Queue)
* 生產者消費者模型是根據隊列來實現的 * 生產者把產生的消費者所需要的數據放入隊列中,消費者再去隊列中取出來 * 這一個知識點其實是隊列的應用方式 from multiprocessing import Process, Queuedef producer(pro_name, q): # 生產者for i in range(1,4):res = f"{pro_name}生產的第{i}個蛋"time.sleep(2)print(res)q.put(res)def consumer(con_name, q):while True: # 必須得死循環,因為你不知道生產者會生產多少東西,這個時候進程間通訊就起到很重要的作用res = q.get()if res is None:breakprint(f"{con_name}吃{res}")if __name__ == '__main__':q = Queue()p1 = Process(target=producer,args=("xc",q))c1 = Process(target=consumer,args=("wr",q))p1.start()c1.start()p1.join()q.put(None) # 在生產者結束生產之后,再傳一個空值,因為消費者處于一直等待的狀態,必須使用結束語句c1.join()print("打烊了")4.生產者消費者模型(JoinableQueue)
from multiprocessing import Process,JoinableQueue import timedef producer(pro_name, q): # 生產者for i in range(3):print(f"{pro_name}做的第{i+1}個包子")res = f"{pro_name}做的第{i+1}個包子"q.put(res)# q.join() # 接受消費者取值的信號 def consumer(con_name, q):while True:res = q.get()print(f"{con_name}吃了{res}")q.task_done() # 發送消費者取值的信號,消費者把管道里面的數據取完了之后,生產者里面的join才會結束運行# 這個其實就是這個數據要是接收完畢,就會給發送數據的一個消息,發送數據就可以執行完畢if __name__ == '__main__':q = JoinableQueue() # 這個方法 也就是可以join的 (也就是等待包含task_done的語句數據接收完,而不是執行完的時候)p1 = Process(target=producer,args=('xc',q))p2 = Process(target=producer,args=('xxc',q))c1 = Process(target=consumer,args=('小狗',q))c1.daemon = True # 因為本身消費者語句雖然接收完數據了,但是還是再運行,可是已經沒有數據可以接受了,所以我們定義守護進程,讓他伴隨主進程結束而結束p1.start()p2.start()c1.start()p1.join()p2.join()q.join() # 寫再這里和卸載生產者語句里面是一樣的print("打烊了")轉載于:https://www.cnblogs.com/xiongchao0823/p/11527617.html
總結
以上是生活随笔為你收集整理的进程 互斥锁、队列与管道、生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: span元素
- 下一篇: 线程了解以及创建线程的Threading