程序間通訊——佇列(multiprocess.queue)
概念介紹
建立共享的程序佇列,queue是多程序安全的佇列可以使用queue實現多程序之間的資料傳遞。
from multiprocessing import queue, process
# 子程序新增佇列
def produce(q):
# 在佇列中放入『hello』
q.put('hello')
# 子程序獲取佇列資料
def cus(q):
# 獲取佇列資料並列印
a = q.get()
print(a)
if __name__ == '__main__':
# 建立佇列
q = queue()
p = process(target=produce,args=(q,))
p1 = process(target=cus,args=(q,))
p.start()
p1.start()
在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。
為什麼要使用生產者和消費者模式
什麼是生產者消費者模式
生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。
from multiprocessing import process,queue
import time
import random
def producer(name,food,q):
for i in range(10):
time.sleep(random.randint(1,3))
f = '%s生產了%s%s'%(name, food, i)
print(f)
time.sleep(random.randint(1,3))
q.put(f)
def consumers(q, name):
while true:
food = q.get()
if food is none:break
print('%s消費了%s'%(name,food))
time.sleep(random.randint(1,3))
if __name__ == '__main__':
q = queue()
name = ['alex','倩倩','海倫妹','歐陽妹']
food = ['包子','饅頭']
pro = process(target=producer,args=(name[0],food[0],q))
pro1 = process(target=producer,args=(name[1],food[1],q))
c = process(target=consumers,args=(q,name[2]))
c1 = process(target=consumers, args=(q, name[3]))
c1.start()
c.start()
pro.start()
pro1.start()
pro.join()
pro1.join()
q.put(none)
q.put(none)
改良版:
from multiprocessing import process,queue,joinablequeue
import time
import random
def producer(name,food,q):
for i in range(10):
time.sleep(random.randint(1,3))
f = '%s生產了%s%s'%(name, food, i)
print(f)
time.sleep(random.randint(1,3))
q.put(f)
q.join() # 阻塞 直到感知乙個佇列中的資料全部被執行完畢
def consumers(q, name):
while true:
food = q.get()
if food is none:break
print('%s消費了%s'%(name,food))
time.sleep(random.randint(1,3))
q.task_done()
if __name__ == '__main__':
q = joinablequeue(20)
name = ['alex','倩倩','海倫妹','歐陽妹']
food = ['包子','饅頭']
pro = process(target=producer,args=(name[0],food[0],q))
pro1 = process(target=producer,args=(name[1],food[1],q))
c = process(target=consumers,args=(q,name[2]))
c1 = process(target=consumers, args=(q, name[3]))
c.daemon = true # 建立守護 當主程序中的**執行完之後子程序自動結束
c1.daemon = true
c1.start()
c.start()
pro.start()
pro1.start()
pro.join()
pro1.join()
rabbitmq學習二 佇列
require once dir vendor autoload.php use phpamqplib connection amqpstreamconnection use phpamqplib message amqpmessage 1.鏈結伺服器 connection new amqpstre...
FreeRTOS學習 九 佇列操作
宣告及感謝 跟隨正點原子資料學習,在此作為學習的記錄和總結 環境 keil stm32f103 佇列用於通訊的,所以佇列也可也叫訊息佇列.佇列出隊阻塞 當任務嘗試從乙個佇列中讀取訊息的時候可以指定乙個阻塞時間.1 當阻塞時間 設定為0 的時候為 不阻塞 2 當阻塞時間設定為0 portmax del...
C語言學習(十) 佇列
佇列是特殊的線性表 隊頭 front 取出資料的一端 隊尾 rear 放入資料的一端 迴圈佇列 1.佇列順序儲存的不足 避免出現只有乙個元素時,隊頭和隊尾的重合處理麻煩,引入front指向隊頭元素,rea指向隊尾元素的下乙個位置 front rear時,佇列不是還剩乙個元素,而是空佇列 2.迴圈佇列...