35.python 线程队列Queue-FIFO
admin
2023-01-20 17:42:29
0

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

一.队列分类:

1.线程队列Queue — FIFO(先进先出队列),即哪个数据先存入,取数据的时候先取哪个数据,同生活中的排队买东西;

2.线程队列LifoQueue — LIFO(先进后出队列),即哪个数据最后存入的,取数据的时候先取;

3.线程队列PriorityQueue — PriorityQueue(优先级队列),即存入数据时候加入一个优先级,取数据的时候优先级最高的取出;

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

 

 

二.先进先出队列Queue简介

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

35.python 线程队列Queue-FIFO

 

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

35.python 线程队列Queue-FIFO

 

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

Queue.qsize()    返回队列大小

Queue.empty()  判断队列是否为空

Queue.full()        判断队列是否满了

Queue.get([block[,timeout]])  从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有item出现为止来get出这个item。如果是False的话表明当队列为空你却去get的时候,会引发异常。在block为True的情况下可以再设置timeout参数。表示当队列为空,get阻塞timeout指定的秒数之后还没有get到的话就引发Full异常。

 

Queue.task_done()  从场景上来说,处理完一个get出来的item之后,调用task_done将向队列发出一个信号,表示本任务已经完成(与Queue.get配对使用)。

 

Queue.put(…[,block[,timeout]])  向队尾插入一个item,同样若block=True的话队列满时就阻塞等待有空位出来再put,block=False时引发异常。同get的timeout,put的timeout是在block为True的时候进行超时设置的参数。

 

Queue.join()  监视所有item并阻塞主线程,直到所有item都调用了task_done之后主线程才继续向下执行。这么做的好处在于,假如一个线程开始处理最后一个任务,它从任务队列中拿走最后一个任务,此时任务队列就空了但最后那个线程还没处理完。当调用了join之后,主线程就不会因为队列空了而擅自结束,而是等待最后那个线程处理完成了。

 

 

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

# !usr/bin/env python

# -*- coding:utf-8 _*-

"""

@Author:何以解忧

@Blog(个人博客地址): shuopython.com

@WeChat Official Account(微信公众号):猿说python

@Github:www.github.com

 

@File:python_queue.py

@Time:2019/11/29 15:25

 

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

输出结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

数字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

 

转载请注明:猿说Python » python线程队列Queue-FIFO

 


相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...