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