六.併發編程 (線程對列)

一 .線程隊列(queue)和進程差很少(參照進程)7

一. 線程隊列

  引入線程隊列 : import queue  #和普通隊列引入方法相同

  線程隊列方法 : 
    q = queue.Queue()  #實例化對列,先進先出

    q = queue.LifoQueue()  #實例化隊列,後進先出  ( Last in, first out )

    q = queue.PriorityQueue()  #實例化隊列,優先級隊列

      優先級隊列,put() 方法接收的是一個元組,第一個元素是優先級,第二個元素是數據

      優先級若是爲數字,按照數字大小比較

      若是優先級是字符串或特殊字符,按照字符串或特殊字符的ASCII碼比較,若是ASCII碼相同,按照先進先出原則取出

 

1.隊列先進先出(queue)

import queue

q=queue.Queue()
q.put('first')
q.put('second')
q.put('third')

print(q.get())
print(q.get())
print(q.get())
'''
結果(先進先出):
first
second
third
'''

2.棧先進後出(queue.LifoQueue())

import queue

q=queue.LifoQueue()
q.put('first')
q.put('second')
q.put('third')

print(q.get())
print(q.get())
print(q.get())
'''
結果(後進先出):
third
second
first
'''

3.隊列生產者消費者

from  threading import Thread,Event
import queue,time

def put_a(name,food,q):
    for i in range(10):
        ret="%s生產%s-->%s個"%(name,food,i)
        q.put(ret)
        print(ret)
    q.put(None)


def get_a(q,name):
    while True:
        ret=q.get()
        if ret is None:break
        time.sleep(1)
        print("%s---->吃%s"%(name,ret))

q=queue.Queue()
p1=Thread(target=put_a,args=("張三","包子",q))
p2=Thread(target=get_a,args=(q,"李四"))
p1.start()
p1.join()

p2.start()

 4. 存儲數據時可設置優先級的隊列(queue.PriorityQueue(maxsize=0))

import queue

q=queue.PriorityQueue()
#put進入一個元組,元組的第一個元素是優先級(一般是數字,也能夠是非數字之間的比較),數字越小優先級越高
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))

print(q.get())
print(q.get())
print(q.get())
'''
結果(數字越小優先級越高,優先級高的優先出隊):
(10, 'b')
(20, 'a')
(30, 'c')
'''
相關文章
相關標籤/搜索