程序的佇列通訊 消費者生產者的模型

2022-06-20 17:03:12 字數 1547 閱讀 6796

from multiprocessing import process, joinablequeue

import time

def shop(q, shopping):

for i in range(10):

q.put('包子')

print('%s 好了 %s' % (shopping, i))

def person(q):

while true:

food = q.get()

print('客戶吃了乙個%s' % food)

q.task_done()

錯誤案例:

if __name__ == '__main__':

q = joinablequeue()

q1 = process(target=shop, args=(q, 'egon'))

q2 = process(target=shop, args=(q, 'alex'))

c1 = process(target=person, args=(q,))

q1.start()

q2.start()

c1.daemon = true

c1.start()

time.sleep(0.65)

# print(q.get_nowait()) # 這樣寫發現,q是空的,因為此時,程序q1,q2還沒往佇列中新增值,所以此時,q.join()是完成的,直接主程式完成,所以,c1 根本沒來得及執行就結束了

q.join() # 說明**的執行遠遠快於 程序 的建立和執行。所以,要等 程序 q1,q2 完成後,在執行q.join()

# 加上time.sleep(0.5)程式可以部分的執行正常,即 程序 q1,q2 在這段時間已經完成了一部分新增。但是可能會提前取完

# 如圖所示

print('主程式')

正確案例:

if __name__ == '__main__':

q = joinablequeue()

q1 = process(target=shop, args=(q, 'egon'))

q2 = process(target=shop, args=(q, 'alex'))

c1 = process(target=person, args=(q,))

q1.start()

q2.start()

c1.daemon = true # 這裡設定 程序 c1 是主程式的守護程序

c1.start()

q1.join() # 要在程序 q1 , q2 將資料新增完成後,再判斷 q 是否所有資料都取出,也就是 程序 c1 是否可以結束了,

q2.join()

q.join()

print('主程式')

執行緒的通訊 生產者消費者

public static void main string agrs class resource catch interruptedexception e this.name name cont system.out.println thread.currentthread getname pr...

佇列,生產者消費者模型

from multiprocessing import process,lock import os,time,json with open user w encoding utf 8 as f dic json.dump dic,f def search with open user r enco...

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...