python 异步 生产者 消费者_python 线程通信 生产者与消费者
1 """
2 線程通信的生產者與消費者3 python的queue模塊中提供了同步的線程安全的隊列類,都具有原子性,實現線程間的同步4 Queue (FIFO: fist in fist out)5 LifoQueue (LIFO: last in fist out)6 PriorityQueue (優(yōu)先級隊列)7
8 task_done():9 作用是在使用join()的時候,當queue中所有的項目都被取出,且每個項目取出后都使用了task_done(),那么就可以釋放join()阻塞10 系統解釋如下:11 用于消費者,每次get()以后,使用task_done() 是告訴隊列正在處理的get任務完成12 如果join()當前處于阻塞狀態(tài),那么當處理完所有項時它將繼續(xù)運行(這意味著對于已經放入隊列的每個項都接收到task_done()調用)。13 如果調用的次數超過在隊列中放置的項的次數,則引發(fā)ValueError錯誤。14
15 如果不需要join()的時候也可以不使用task_done()16
17
18 """
19 importqueue20 importthreading21 importtime22 importrandom23
24 q = queue.Queue(10)25
26
27 defproduce():28 i =029 while i < 10:30 num = random.randint(1, 100)31 q.put("生產者生產出數據:%d" %num)32 print("生產者生產出數據:%d" %num)33 time.sleep(0.2)34 i += 1
35 print("生產結束")36
37
38 defconsume():39 whileTrue:40 time.sleep(0.3)41 ifq.empty():42 break
43 item =q.get()44 print("消費者取出:", item)45 q.task_done()46
47 print("消費者結束")48
49
50 if __name__ == '__main__':51
52 #創(chuàng)建生產者
53 t1 = threading.Thread(target=produce, name="生產者")54 t1.start()55 time.sleep(0.1)56
57 #創(chuàng)建消費者
58 t2 = threading.Thread(target=consume, name="消費者")59 t2.start()60 q.join()61
62 print("over")63
64
65 #from threading import Thread
66 #import time
67 #import random
68 #from queue import Queue
69 #from collections import deque
70 #from datetime import datetime
71 #72 ## 創(chuàng)建隊列,設置隊列最大數限制為3個
73 #queue = Queue(3)
74 #75 #76 ## 生產者線程
77 #class Pro_Thread(Thread):
78 #def run(self):
79 ## 原材料準備,等待被生產,這里使用的是雙向隊列
80 #tasks = deque([1, 2, 3, 4, 5, 6, 7, 8])
81 #global queue
82 #while True:
83 #try:
84 ## 從原材料左邊開始生產,如果tasks中沒有元素,調用popleft()則會拋出錯誤
85 #task = tasks.popleft()
86 #queue.put(task)
87 #print(datetime.now(), "生產", task, "現在隊列數:", queue.qsize())
88 #89 ## 休眠隨機時間
90 #time.sleep(0.5)
91 ## 如果原材料被生產完,生產線程跳出循環(huán)
92 #except IndexError:
93 #print("原材料已被生產完畢")
94 #break
95 #print("生產完畢")
96 #97 #98 ## 消費者線程
99 #class Con_Thread(Thread):
100 #def run(self):
101 #global queue
102 #while True:
103 #if not queue.empty():
104 ## 通過get(),這里已經將隊列減去了1
105 #task = queue.get()
106 #time.sleep(2)
107 ## 發(fā)出完成的信號,不發(fā)的話,join會永遠阻塞,程序不會停止
108 #queue.task_done()
109 #print(datetime.now(), "消費", task)
110 #else:
111 #break
112 #print("消費完畢")
113 #114 #115 ## r入口方法,主線程
116 #def main():
117 #Pro_1 = Pro_Thread()
118 ## 啟動線程
119 #Pro_1.start()
120 ## 這里休眠一秒鐘,等到隊列有值,否則隊列創(chuàng)建時是空的,主線程直接就結束了,實驗失敗,造成誤導
121 #time.sleep(1)
122 #for i in range(2):
123 #Con_i = Con_Thread()
124 ## 啟動線程
125 #Con_i.start()
126 #global queue
127 ## 接收信號,主線程在這里等待隊列被處理完畢后再做下一步
128 #queue.join()
129 ## 給個標示,表示主線程已經結束
130 #print("主線程結束")
131 #132 #133 #if __name__ == '__main__':
134 #main()
總結
以上是生活随笔為你收集整理的python 异步 生产者 消费者_python 线程通信 生产者与消费者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浙商银行银联标准卡申请条件
- 下一篇: 成都软件工程师python_为什么每个软