Python 多线程-队列

 先进先出

import queue

q = queue.Queue(2)

"""
    队列的第一种模式: 
        1. First In First Out (FIFO) 先进先出
        2. 队列里面的元素为空后,会一直等待新的元素进来.不会退出
        3. 队列长度限定,当长度限定后满员后,如果继续put元素进去,必须现有元素get出去后才能继续put元素进去,否则一直等待元素get出去
"""
q.put(1)
q.put('ok')
q.put({'name': 'jack'})

while q:
    print(q.get())

 

后进先出

import queue

q = queue.LifoQueue()


q.put(1)
q.put('ok')
q.put({'name': 'jack'})

while q:
    print(q.get())

 

 

自定义优先级进出

  put元素为列表,第一个元素为优先级,第二个元素为数据,越低的越先出来

  

import queue

q = queue.PriorityQueue()


q.put([1,'a'])
q.put([3,'c'])
q.put([2,'b'])

while q:
    print(q.get())

 

 

 队列其他方法:

  

import queue

q = queue.PriorityQueue()


q.qsize() # 获取队列元素个数
q.empty() # 获取队列是否为空
q.full()  # 获取队列是否为满
q.task_down() # 在完成动作之后向队列发送一个信号
q.join() #
在完成动作之后向队列发送一个信号后,join后面的任务解除阻塞,否则一直阻塞

 

生产者消费者:

  

import threading
import time
import queue
import  random

class Producer(threading.Thread):
    def __init__(self, thread_name):
        threading.Thread.__init__(self)
        self.thread_name = thread_name

    def run(self):
        i=0
        while True:
            i=i+1
            print('%s生产数据%s'%(self.thread_name,i))
            q.put(i)
            time.sleep(3)  # 生产者正在执行任务
            q.task_done()  # 生产者执行完成任务后 向队列发送信号


class Consumer(threading.Thread):
    def __init__(self,thread_name):
        threading.Thread.__init__(self)
        self.thread_name=thread_name

    def run(self):
        while True:
            q.join()  # 消费者得到信号后,解除阻塞
            data=q.get()
            print('%s得到数据%s'%(self.thread_name,data))



if __name__ == '__main__':
    q=queue.Queue()
   

    t1=Producer('生产者')
    t2=Consumer('消费者1')
    t3 = Consumer('消费者2')
    t4 = Consumer('消费者3')

    t1.start()
    t2.start()
    t3.start()
    t4.start()

 

posted @ 2021-01-10 19:30  leungqingyun  阅读(276)  评论(0)    收藏  举报