寫了一段生產者消費者模型的**:
1from time import
sleep
2from random import
randint, random
3from multiprocessing import
process, queue45
6def
consumer(q, name):
7while 1:
8if q.get() == '
stop
'and q.qsize() ==0:
9break
10 food =q.get()
11print('
%s 吃了 %s
' %(name, food))
12 sleep(randint(1, 3))
1314
15def
producer(q, name, food):
16for i in range(10):
17sleep(random())
18 foo = food +str(i)
19print("
%s 拉了一坨 %s
" %(name, foo))
20q.put(foo)
2122
23if
__name__ == '
__main__':
24 q = queue(10)
25 c = process(target=consumer, args=(q, "老狗"
))26
c.start()
27 p1 = process(target=producer, args=(q, '
峰哥', '粑粑'
))28
p1.start()
29p1.join()
30 q.put('
stop
')
這段**執行的結果是:
1峰哥 拉了一坨 粑粑0
2峰哥 拉了一坨 粑粑1
3老狗 吃了 粑粑1
4峰哥 拉了一坨 粑粑2
5峰哥 拉了一坨 粑粑3
6峰哥 拉了一坨 粑粑4
7老狗 吃了 粑粑3
8峰哥 拉了一坨 粑粑5
9老狗 吃了 粑粑5
10峰哥 拉了一坨 粑粑6
11峰哥 拉了一坨 粑粑7
12老狗 吃了 粑粑7
13峰哥 拉了一坨 粑粑8
14峰哥 拉了一坨 粑粑9
15 老狗 吃了 粑粑9
發現只列印了奇數的產品,排錯發現是邏輯出錯了,應該先用food先從佇列裡面get,然後去判斷,而上面這段**的問題出在每次if判斷從佇列裡面拿出來了乙個導致的
下面是修改後的**:
1from time import
sleep
2from random import
randint, random
3from multiprocessing import
process, queue45
6def
consumer(q, name):
7while 1:
8 food =q.get()
9if food == '
stop':
10break
11print('
%s 吃了 %s
' %(name, food))
12 sleep(randint(1, 3))
1314
15def
producer(q, name, food):
16for i in range(10):
17sleep(random())
18 foo = food +str(i)
19print("
%s 拉了一坨 %s
" %(name, foo))
20q.put(foo)
2122
23if
__name__ == '
__main__':
24 q = queue(10)
25 c = process(target=consumer, args=(q, "老狗"
))26
c.start()
27 p1 = process(target=producer, args=(q, '
峰哥', '粑粑'
))28
p1.start()
29p1.join()
30 q.put('
stop
')
queue的長度 佇列 Queue
佇列 queue 是先進先出 fifo,first in first out 的線性表。在具體應用中通常用鍊錶或者陣列來實現。佇列只允許在後端 稱為rear 進行插入操作,在前端 稱為front 進行刪除操作。隊結構 迴圈佇列可以更簡單防止偽溢位 假溢位 的發生,但佇列大小是固定的。防止假溢位,如d...
佇列Queue的實現
佇列 先進先出 兩種實現方式 1.利用陣列 2.鏈式儲存 需要兩個變數指向隊頭front和隊尾rear,當入隊時,隊尾後移 出隊時,隊頭後移 使用陣列實現,當我們入隊至陣列滿,然後出隊至陣列空,此時雖然陣列為空,但是卻不能再入隊了,因為隊尾rear已經指向了陣列的最後乙個索引位置。那麼如何充分利用陣...
佇列Queue的應用
c 中queue是乙個先進先出的佇列,能有效地模擬排隊問題。c 佇列queue類成員函式如下 back 返回最後乙個元素 empty 如果佇列空則返回真 front 返回第乙個元素 pop 刪除第乙個元素 push 在末尾加入乙個元素 size 返回佇列中元素的個數.定義queue queueq1 ...