<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
程序彼此之間互相隔離,要實現程序間通訊(IPC),multiprocessing模組主要通過佇列方式
佇列:佇列類似於一條管道,元素先進先出
需要注意的一點是:佇列都是在記憶體中操作,程序退出,佇列清空,另外,佇列也是一個阻塞的形態
建立佇列的類(底層就是以管道和鎖定的方式實現):
Queue([maxsize]):建立共用的程序佇列,Queue是多程序安全的佇列,
可以使用Queue實現多程序之間的資料傳遞。maxsize是佇列中允許最大項數,省略則無大小限制。
方法介紹:
def put(self, obj, block=True, timeout=None):插入資料到佇列中 Block值預設為True,代表當佇列已滿時,會阻塞。如果block為False,則佇列滿會報異常Queue.Full timeout表示會阻塞到指定時間,直到有剩餘的空間供插入,如果時間超時,則報異常Queue.Full def get(self, block=True, timeout=None):從佇列中取出資料 Block值預設為True,代表當佇列為空時,會阻塞。如果block為False,則佇列空會報異常Queue.Empty timeout表示會等待到指定時間,直到取出資料,如果時間超時,則報異常Queue.Empty def empty(self): 判斷佇列是否為空,如果空返回True def full(self): 判斷佇列是否已滿,如果滿返回True def qsize(self): 返回佇列的大小
應用舉例:
from multiprocessing import Process, Manager q = Manager().Queue(2) q.put(1) q.put(2,block=False,timeout=2) def func(): print(q.get()) p = Process(target=func) print("size",q.qsize()) print("full",q.full()) p.start() p.join() print("empty",q.empty()) print("get", q.get()) print("get", q.get(block=False,timeout=2))
輸出結果
在並行程式設計中使用生產者和消費者模式能夠解決絕大多數並行問題。該模式通過平衡生產執行緒和消費執行緒的工作能力來提高程式的整體處理資料的速度。
線上程世界裡,生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。為了解決這個問題於是引入了生產者和消費者模式。
生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊:
生產者,只需要往佇列裡面丟東西(生產者不需要關心消費者)
消費者,只需要從佇列裡面拿東西(消費者也不需要關心生產者)
阻塞佇列就相當於一個緩衝區,平衡了生產者和消費者的處理能力。
from multiprocessing import Process,Manager,active_children import random import queue import time class Producer(Process): def __init__(self,queue): super().__init__() self.queue = queue def run(self): for i in range(6): r = random.randint(0, 99) time.sleep(1) self.queue.put(r) print("add data{}".format(r)) class Consumer(Process): def __init__(self,queue): super().__init__() self.queue = queue def run(self): while True: if not self.queue.empty(): data = self.queue.get() print("minus data{}".format(data)) if __name__ == '__main__': q = Manager().Queue() # 建立佇列 p = Producer(q) c = Consumer(q) p.start() c.start() print(active_children()) # 檢視現有的程序 p.join() c.join() print("結束")
JoinableQueue([maxsize]):一個Queue物件,但佇列允許專案的使用者通知生成者專案已經被成功處理。通知程序是使用共用的訊號和條件變數來實現的。
JoinableQueue的範例除了與Queue物件相同的方法之外還具有:
task_done():使用者使用此方法發出訊號,表示get()的返回專案已經被處理。如果呼叫此方法的次數大於從佇列中刪除專案的數量,將引發ValueError異常
join():生產者呼叫此方法進行阻塞,直到佇列中所有的專案均被處理。阻塞將持續到佇列中的每個專案均呼叫task_done()方法為止
from multiprocessing import Process,JoinableQueue import os import time import random def print_log(msg, log_type="prod"): if log_type == 'prod': print(" 33[32;1m%s 33[0m" %msg) elif log_type == 'con': print(" 33[31;1m%s 33[0m" %msg) def producer(q): """ 生產者 :param q: :return: """ for i in range(10): data = random.randint(1,200) time.sleep(2) q.put(data) # 放入佇列 msg = "add data {}".format(data) print_log(msg) q.join() # 生產者呼叫此方法進行阻塞,直到佇列中所有的專案均被處理。 # 阻塞將持續到佇列中的每個專案均呼叫q.task_done()方法為止 def consumer(q): """ 消費者 :param q: :return: """ while True: if not q.empty(): time.sleep(5) data = q.get() msg = "minus data{}".format(data) print_log(msg,"con") q.task_done() # q.get()的返回專案已經被處理 if __name__ == '__main__': q = JoinableQueue() prod = Process(target=producer, args=(q,)) con = Process(target=consumer, args=(q,)) con.daemon = True # 設定為守護行程,但是不用擔心,producer內呼叫q.join保證了consumer已經處理完佇列中的所有元素 # 開啟程序 prod.start() con.start() prod.join() # 等待生產和消費完成,主執行緒結束 print("結束")
輸出結果
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45