日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 异步 生产者 消费者_python 线程通信 生产者与消费者

發(fā)布時間:2023/12/10 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 异步 生产者 消费者_python 线程通信 生产者与消费者 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 """

2 線程通信的生產(chǎn)者與消費者3 python的queue模塊中提供了同步的線程安全的隊列類,都具有原子性,實現(xiàn)線程間的同步4 Queue (FIFO: fist in fist out)5 LifoQueue (LIFO: last in fist out)6 PriorityQueue (優(yōu)先級隊列)7

8 task_done():9 作用是在使用join()的時候,當(dāng)queue中所有的項目都被取出,且每個項目取出后都使用了task_done(),那么就可以釋放join()阻塞10 系統(tǒng)解釋如下:11 用于消費者,每次get()以后,使用task_done() 是告訴隊列正在處理的get任務(wù)完成12 如果join()當(dāng)前處于阻塞狀態(tài),那么當(dāng)處理完所有項時它將繼續(xù)運行(這意味著對于已經(jīng)放入隊列的每個項都接收到task_done()調(diào)用)。13 如果調(diào)用的次數(shù)超過在隊列中放置的項的次數(shù),則引發(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("生產(chǎn)者生產(chǎn)出數(shù)據(jù):%d" %num)32 print("生產(chǎn)者生產(chǎn)出數(shù)據(jù):%d" %num)33 time.sleep(0.2)34 i += 1

35 print("生產(chǎn)結(jié)束")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("消費者結(jié)束")48

49

50 if __name__ == '__main__':51

52 #創(chuàng)建生產(chǎn)者

53 t1 = threading.Thread(target=produce, name="生產(chǎn)者")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)建隊列,設(shè)置隊列最大數(shù)限制為3個

73 #queue = Queue(3)

74 #75 #76 ## 生產(chǎn)者線程

77 #class Pro_Thread(Thread):

78 #def run(self):

79 ## 原材料準備,等待被生產(chǎn),這里使用的是雙向隊列

80 #tasks = deque([1, 2, 3, 4, 5, 6, 7, 8])

81 #global queue

82 #while True:

83 #try:

84 ## 從原材料左邊開始生產(chǎn),如果tasks中沒有元素,調(diào)用popleft()則會拋出錯誤

85 #task = tasks.popleft()

86 #queue.put(task)

87 #print(datetime.now(), "生產(chǎn)", task, "現(xiàn)在隊列數(shù):", queue.qsize())

88 #89 ## 休眠隨機時間

90 #time.sleep(0.5)

91 ## 如果原材料被生產(chǎn)完,生產(chǎn)線程跳出循環(huán)

92 #except IndexError:

93 #print("原材料已被生產(chǎn)完畢")

94 #break

95 #print("生產(chǎn)完畢")

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(),這里已經(jīng)將隊列減去了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)建時是空的,主線程直接就結(jié)束了,實驗失敗,造成誤導(dǎo)

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 ## 給個標(biāo)示,表示主線程已經(jīng)結(jié)束

130 #print("主線程結(jié)束")

131 #132 #133 #if __name__ == '__main__':

134 #main()

總結(jié)

以上是生活随笔為你收集整理的python 异步 生产者 消费者_python 线程通信 生产者与消费者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。