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()