日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程 互斥锁、队列与管道、生产者消费者模型

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程 互斥锁、队列与管道、生产者消费者模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1.互斥鎖
  • 2.隊列與管道
  • 3.生產者消費者模型(Queue)
  • 4.生產者消費者模型(JoinableQueue)

1.互斥鎖

  • 首先導入Lock模塊
  • 實例化一把鎖
  • 但是每次生成子進程的時候都會重新實例化一把鎖,我們的目的是想讓所有的子進程使用同一把鎖,所以需要把鎖傳遞給子進程在使用 鎖名.acquire():開鎖->所有子進程開始搶位置 鎖名.release():關鎖->位置排好了,開始執鎖起來執行.
  • join與互斥鎖的區別:join是把所有的子進程代碼變為串行的,而互斥鎖則可以規定那幾行代碼變為串行
from multiprocessing import Process,Lock import timedef foo(user,lock_new):lock_new.acquire()print(f"{user}--1")time.sleep(1)print(f"{user}--2")time.sleep(1)print(f"{user}--3")lock_new.release()if __name__ == '__main__':lock_new = Lock()for i in range(1,4):p = Process(target=foo, args=(i,lock_new))p.start()

2.隊列與管道

  • 互斥鎖是基于硬盤資源的
  • 隊列和管道是基于內存的,multiprocessing模塊提供了這個處理操作,也就是IPC,基于網絡間進程通信的方式
  • 隊列是管道和鎖的結合
  • 隊列需要遵守先進先出算法
  • 還有就是就算不控制隊列大小,他之后也會往里面塞數據
  • 隊列里面是放小數據的,不可以放類似視頻的這種大數據
from multiprocessing import Queueq = Queue(3) q.put(1) q.put(2) q.put(3) print(q.full()) print(q.get()) print(q.get()) print(q.get()) print(q.empty())

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

總結

以上是生活随笔為你收集整理的进程 互斥锁、队列与管道、生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。