之前的文章中讲解很多关于线程间通信的知识,比如:线程互斥锁lock线程事件event线程条件变量condition 等等,这些都是在开发中经常使用的内容,而今天继续给大家讲解一个更重要的知识点 — 线程队列queue。

一.队列分类:

1.线程队列Queue

2.线程队列LifoQueue

3.线程队列PriorityQueue

今天只对第一种普通线程队列Queue(FIFO)讲解,后面的两种留到下一篇文章在做详细讲解!

二.先进先出队列Queue简介

线程队列Queue,也称FIFO,存在队列中的数据先进先出,就好比拉肚子,吃什么拉什么~~呃呃,有点重口味,如下图:




python队列存储 python lifo队列_python队列存储


举个形象的例子:如果把123456这6个数字,依次放入队列queue中,那么我们重队列中取数据的时候,取到的第一个数据必然是1,第二个数据必然是2,依次类推,这就是所谓的吃什么拉什么 — FIFO(先进先出)


python队列存储 python lifo队列_python_02


三.先进先出队列Queue常用函数

Queue.qsize()

Queue.empty()

Queue.full()

Queue.get([block[,timeout]])

Queue.task_done()

Queue.put(…[,block[,timeout]])

Queue.join()

四.先进先出队列Queue使用:


# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧

@File:python_queue.py
 
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
 
import threading
import queue
 
q = queue.Queue(5) # 长度,队列中最多存放5个数据
 
 
def put():
 for i in range(20):
 q.put(i)
 print("数字%d存入队列成功" % i)
 q.join() # 阻塞进程,直到所有任务完成,取多少次数据task_done多少次才行,否则最后的ok无法打印
 print('ok')
 
 
def get():
 for i in range(20):
 value = q.get()
 print("数字%d重队列中取出" % value)
 q.task_done() # 必须每取走一个数据,发一个信号给join
 # q.task_done()   #放在这没用,因为join实际上是一个计数器,put了多少个数据,
 # 计数器就是多少,每task_done一次,计数器减1,直到为0才继续执行
 
 
t1 = threading.Thread(target=put, args=())
t1.start()
t2 = threading.Thread(target=get, args=())
t2.start()


输出结果:


数字0存入队列成功
数字1存入队列成功
数字2存入队列成功
数字3存入队列成功
数字4存入队列成功
数字0重队列中取出
数字1重队列中取出
数字2重队列中取出
数字3重队列中取出
数字4重队列中取出
数字5存入队列成功
数字6存入队列成功
数字7存入队列成功
数字8存入队列成功
数字9存入队列成功
数字5重队列中取出
数字6重队列中取出
数字7重队列中取出
数字8重队列中取出
数字9重队列中取出
数字10存入队列成功
数字11存入队列成功
数字12存入队列成功
数字13存入队列成功
数字14存入队列成功
数字10重队列中取出
数字11重队列中取出
数字12重队列中取出
数字15存入队列成功
数字16存入队列成功
数字17存入队列成功
数字13重队列中取出
数字14重队列中取出
数字15重队列中取出
数字16重队列中取出
数字18存入队列成功
数字19存入队列成功
数字17重队列中取出
数字18重队列中取出
数字19重队列中取出
ok


猜你喜欢:

1.pycharm配置开发模板

2.python字典推导式

3.python列表推导式

4.python匿名函数lambda