多线程利器-队列(queue)
生活随笔
收集整理的這篇文章主要介紹了
多线程利器-队列(queue)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#隊列有3中模式,先進先出,先進后出,優先級 1:先進先出
import queue q = queue.Queue() #默認是先進先出
q.put(12)
q.put('jack')
q.put({'name':'ok'})
while True:
data = q.get()
print(data)
q = queue.Queue(maxsize = 2) #隊列數據只能存三個數據
q.put(12)
q.put('jack')
q.put([1,2,3])
q.put({'name':'ok'}) #存滿三個數據超出后;就卡死在這,除非有另外一個線程取前面的數據
while True:
data = q.get()
print(data)
q = queue.Queue() q.put(12)
q.put('jack')
q.put([1,2,3])
q.put({'name':'ok'},False) #False 隊列滿了提示報錯
while True:
data = q.get(block=False) #False 隊列取完提示報錯
print(data)
2:先進后出(LifoQueue) q = queue.LifoQueue()
q.put(12)
q.put('jack')
q.put([1,2,3])
while True:
data = q.get()
print(data)
3:優先級(PriorityQueue);誰小誰現出 q = queue.PriorityQueue()
q.put([3,12]) #列表第一個元素代表優先級
q.put([2,'jack'])
q.put([5,[1,2,3]])
while True:
data = q.get()
print(data)
其他一些操作:
此包中的常用方法(q = Queue.Queue()): q.qsize() 返回隊列的大小 q.empty() 如果隊列為空,返回True,反之False q.full() 如果隊列滿了,返回True,反之False q.full 與 maxsize 大小對應 q.get([block[, timeout]]) 獲取隊列,timeout等待時間 q.get_nowait() 相當q.get(False) 非阻塞 q.put(item) 寫入隊列,timeout等待時間 q.put_nowait(item) 相當q.put(item, False) q.task_done() 在完成一項工作之后,q.task_done() 函數向任務已經完成的隊列發送一個信號 q.join() 實際上意味著等到隊列為空,再執行別的操作 q = queue.PriorityQueue(maxsize=3)
q.put([3,12])
q.put([2,'jack'])
q.put([5,[1,2,3]])
print(q.qsize()) #隊列有多少值
print(q.empty()) #是否為空,False
print(q.full()) #是否已經存滿,如果是True(上面寫了最大3個)
q.get_nowait(22) 等價于 q.get(block=False) #22隨便放的數就可以了
q.put_nowait(22) 等價于 q.put(block=False) ? q.task_done() 和 q.join()示例 import time,random
import queue,threading
q = queue.Queue()
def Producer(name):
count = 0
while count <10:
print("making........")
time.sleep(2)
q.put(count)
print('Producer %s has produced %s baozi..' %(name, count))
count +=1
q.task_done() #這里面發送一個完成的信息給隊里q (q.join() )
print("ok......")
def Consumer(name):
count = 0
while count <10:
q.join() #這里面接收到隊里q有完成的信息后,就接著運行下面代碼,不然會一直在這卡死狀態,等待上面生成完包子的信息(同理如果這是q.task_done(),就會產生吃完包子的消息,上面q.join()接收消息后接著生產)
data = q.get()
print('\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data))
count +=1
p1 = threading.Thread(target=Producer, args=('A',))
c1 = threading.Thread(target=Consumer, args=('B',))
c2 = threading.Thread(target=Consumer, args=('C',))
# c3 = threading.Thread(target=Consumer, args=('D',))
p1.start()
c1.start()
c2.start()
# c3.start()
?
import queue q = queue.Queue() #默認是先進先出
q.put(12)
q.put('jack')
q.put({'name':'ok'})
while True:
data = q.get()
print(data)
q = queue.Queue(maxsize = 2) #隊列數據只能存三個數據
q.put(12)
q.put('jack')
q.put([1,2,3])
q.put({'name':'ok'}) #存滿三個數據超出后;就卡死在這,除非有另外一個線程取前面的數據
while True:
data = q.get()
print(data)
q = queue.Queue() q.put(12)
q.put('jack')
q.put([1,2,3])
q.put({'name':'ok'},False) #False 隊列滿了提示報錯
while True:
data = q.get(block=False) #False 隊列取完提示報錯
print(data)
2:先進后出(LifoQueue) q = queue.LifoQueue()
q.put(12)
q.put('jack')
q.put([1,2,3])
while True:
data = q.get()
print(data)
3:優先級(PriorityQueue);誰小誰現出 q = queue.PriorityQueue()
q.put([3,12]) #列表第一個元素代表優先級
q.put([2,'jack'])
q.put([5,[1,2,3]])
while True:
data = q.get()
print(data)
其他一些操作:
此包中的常用方法(q = Queue.Queue()): q.qsize() 返回隊列的大小 q.empty() 如果隊列為空,返回True,反之False q.full() 如果隊列滿了,返回True,反之False q.full 與 maxsize 大小對應 q.get([block[, timeout]]) 獲取隊列,timeout等待時間 q.get_nowait() 相當q.get(False) 非阻塞 q.put(item) 寫入隊列,timeout等待時間 q.put_nowait(item) 相當q.put(item, False) q.task_done() 在完成一項工作之后,q.task_done() 函數向任務已經完成的隊列發送一個信號 q.join() 實際上意味著等到隊列為空,再執行別的操作 q = queue.PriorityQueue(maxsize=3)
q.put([3,12])
q.put([2,'jack'])
q.put([5,[1,2,3]])
print(q.qsize()) #隊列有多少值
print(q.empty()) #是否為空,False
print(q.full()) #是否已經存滿,如果是True(上面寫了最大3個)
q.get_nowait(22) 等價于 q.get(block=False) #22隨便放的數就可以了
q.put_nowait(22) 等價于 q.put(block=False) ? q.task_done() 和 q.join()示例 import time,random
import queue,threading
q = queue.Queue()
def Producer(name):
count = 0
while count <10:
print("making........")
time.sleep(2)
q.put(count)
print('Producer %s has produced %s baozi..' %(name, count))
count +=1
q.task_done() #這里面發送一個完成的信息給隊里q (q.join() )
print("ok......")
def Consumer(name):
count = 0
while count <10:
q.join() #這里面接收到隊里q有完成的信息后,就接著運行下面代碼,不然會一直在這卡死狀態,等待上面生成完包子的信息(同理如果這是q.task_done(),就會產生吃完包子的消息,上面q.join()接收消息后接著生產)
data = q.get()
print('\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data))
count +=1
p1 = threading.Thread(target=Producer, args=('A',))
c1 = threading.Thread(target=Consumer, args=('B',))
c2 = threading.Thread(target=Consumer, args=('C',))
# c3 = threading.Thread(target=Consumer, args=('D',))
p1.start()
c1.start()
c2.start()
# c3.start()
?
轉載于:https://www.cnblogs.com/ajaxa/p/9134423.html
總結
以上是生活随笔為你收集整理的多线程利器-队列(queue)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ansible部署
- 下一篇: angular5 httpclient的