前言

    在这里python中队列的学习记录在此.

1.什么是队列?

    在这里说一下我对队列的理解.
    其实队列的概念很好理解,就是说按顺序排好队,然后有序的进行出入.我们生活中几乎每天都会遇到队列的例子:在超市买完东西结账的时候,在食堂打饭的时候,在银行办理业务的时候…
    在python中,队列有四种存在形式(其实不光python,我们日常生活中的队列也几乎就是以下四种形式):

  • 先进先出型(FIFO)-----queue.Queue()
  • 后进先出型(LIFO)----queue.LifoQueue()
  • 优先队列----queue.PriorityQueue()
  • 双边队列----queue.deque()

2.python的4中队列形式

(1)先进先出型

import queue

que = queue.Queue(maxsize=10)           # maxsize=10的意思是这个队列中最多放10个元素


que.put(1)                              # que.put(data):将data放入q中
que.put(2)
que.put(3)

print('队列中元素:',que.queue)            # 列出队列中的所有元素

print('队列大小',que.qsize())             # 队列大小

data_1 = que.get()
print('队列中元素:',que.queue)            # 列出队列中的所有元素
data_2 = que.get()
print('队列中元素:',que.queue)            # 列出队列中的所有元素
data_3 = que.get()
print('队列中元素:',que.queue)            # 列出队列中的所有元素
print('第一次取出',data_1)
print('第二次取出',data_2)
print('第三次取出',data_3)

执行结果:

队列中元素: deque([1, 2, 3])
队列大小 3
队列中元素: deque([2, 3])
队列中元素: deque([3])
队列中元素: deque([])
第一次取出 1
第二次取出 2
第三次取出 3

程序说明:

  • 实例化Queue对象
que = queue.Queue(maxsize=10)

注:maxsize=10是指这个队列中最多能放10个元素.

  • 将数据放入队列中
que.put(1)                              # que.put(data):将data放入q中
que.put(2)
que.put(3)

注:按顺序将元素依次放入队列.

  • 从队列中取数据
data = que.get()

注:que.get()方法是将队列中的元素取出来,返回的是取出的元素,将元素从队列中取出以后,队列中就没有这个元素了.在取出元素的时候,是按着先进先出的原则来取的

  • 列出队列中的所有元素
print('队列中元素:',que.queue)
  • 查看队列大小
que.qsize()

(2)后进先出型

import queue

que = queue.LifoQueue(maxsize=10)           # maxsize=10的意思是这个队列中最多放10个元素


que.put(1)                              # que.put(data):将data放入q中
que.put(2)
que.put(3)

print('队列中元素:',que.queue)            # 列出队列中的所有元素

print('队列大小',que.qsize())             # 队列大小

data_1 = que.get()
print('队列中元素:',que.queue)            # 列出队列中的所有元素
data_2 = que.get()
print('队列中元素:',que.queue)            # 列出队列中的所有元素
data_3 = que.get()
print('队列中元素:',que.queue)            # 列出队列中的所有元素
print('第一次取出',data_1)
print('第二次取出',data_2)
print('第三次取出',data_3)

执行结果:

队列中元素: [1, 2, 3]
队列大小 3
队列中元素: [1, 2]
队列中元素: [1]
队列中元素: []
第一次取出 3
第二次取出 2
第三次取出 1

注:LifoQueue的用法和Queue的用法是一样的,只不过在取元素的时候,是按着后进先出的原则来取的.

(3)设置优先级队列

    可能会有人对这种队列有疑问,想知道这种队列会在什么场景下用.在这里,我举一个比较简单的例子,大家就会明白.某一天你去银行取钱,这一天银行人比较多,总共有100人排队,按正常情况下来说,就是按着先来后到的原则依次排队等候,但是由于你是VIP,所以尽管你来的比较晚,但是依然能排到前面去,而其他人,依然是按着先来后到的顺序进行排队.
    下面来看程序:

import queue

q = queue.PriorityQueue(maxsize=10)

q.put((1,'fan'))
q.put((4,'feng'))
q.put((3,'lin'))
q.put((9,'kong'))

print(q.queue)
print(q.qsize())

for i in range(1,5):
    data = q.get()
    print('第{}次取出的数据为:{}'.format(i,data))
    print('队列中剩余元素:',q.queue)

执行结果:

[(1, 'fan'), (4, 'feng'), (3, 'lin'), (9, 'kong')]
4
第1次取出的数据为:(1, 'fan')
队列中剩余元素: [(3, 'lin'), (4, 'feng'), (9, 'kong')]
第2次取出的数据为:(3, 'lin')
队列中剩余元素: [(4, 'feng'), (9, 'kong')]
第3次取出的数据为:(4, 'feng')
队列中剩余元素: [(9, 'kong')]
第4次取出的数据为:(9, 'kong')
队列中剩余元素: []

程序解释:

q.put((1,'fan'))
q.put((4,'feng'))
q.put((3,'lin'))
q.put((9,'kong'))

q.put()是将元素放入队列中,接收一个参数,这里传入一个元组,元组里面的意思是:第一个参数是优先级,数字越小,优先级越高,可以这样理解,第一名比第二名受到的待遇要好,第二个参数就是要存入队列的数据.

(4)双边队列

import queue

#双边队列
dq = queue.deque(['a','b'])

#增加数据到队尾
dq.append('c')
#增加数据到队左
dq.appendleft('d')

#输出队列所有数据
print(dq)
#移除队尾,并返回
print(dq.pop())
#移除队左,并返回
print(dq.popleft())

执行结果:

deque(['d', 'a', 'b', 'c'])
c
d

3.队列中的其他方法

(1)返回队列大小

q.qsize()

(2)判断队空

q.empty()

如果队列为空,返回True
(3)判断队满

q.full()

如果队列为满,返回True

4.生产者消费者模型

import time
import threading
import queue


# 生产者
def product(name):
    count = 1
    while True:
        q.put('包子{}'.format(count))                 # 将包子放入队列中
        print('{}生产包子{}个'.format(name,count))
        count += 1
        time.sleep(0.3)


def consume(name):
    while True:
        print('{}吃了{}'.format(name,q.get()))
        time.sleep(0.3)
        q.task_done()       # 表明以前排队的任务已经完成


if __name__ == '__main__':
    q = queue.Queue(maxsize=2)
    t1 = threading.Thread(target=product,args = ('张三',))
    t2 = threading.Thread(target=consume,args = ('李四',))
    t3 = threading.Thread(target=consume,args = ('王五',))
    t1.start()
    t2.start()
    t3.start()

执行结果:

张三生产包子1个
李四吃了包子1
张三生产包子2个
王五吃了包子2
张三生产包子3个
王五吃了包子3
张三生产包子4个
李四吃了包子4
张三生产包子5个
王五吃了包子5
张三生产包子6个
李四吃了包子6
张三生产包子7个
李四吃了包子7
张三生产包子8个
李四吃了包子8
写在最后

    本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.