新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V5.9版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 243|回复: 0

[模块] 7810 - Python库 CP014【queue】标准库 - 列队模块详解

 关闭 [复制链接]
发表于 2021-9-28 22:44:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

x
Python Queue 模块详解
: c5 K5 d0 H1 v0 \- t/ ^
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象* Y% w- z7 L/ N; S: s, i- W6 f- K
import queue2 M! }) I& Q& S3 l( j3 w3 x
q = queue.queue(maxsize = 10)
. m* [8 ?8 `. U& pqueue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中" M2 r  r1 F, c& s; @  R( l2 j0 W
q.put(10)9 U  p2 `$ ^( W! b+ w
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为4 u, i" b! ]. J: E
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出
: b: y3 N; F2 l* _$ _q.get()& D% Z/ u5 M; W1 p& D
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:5 G5 A. j& `' x2 k
1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize); f+ u6 Z7 y6 W2 _
2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)
! r$ e6 i- E" r2 K: E3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):
5 v' V: s6 B  @; M& H# |
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False
% C) h3 I( x1 R1 L1 [+ ~0 f$ Wq.full() 如果队列满了,返回True,反之False. ?! ~: X0 u( \' e4 D# ]. V
q.full 与 maxsize 大小对应" U- F3 V7 `2 X" s% \% w+ z
q.get([block[, timeout]]) 获取队列,timeout等待时间
( V6 ^1 x0 S! ?, d: l( ~q.get_nowait() 相当q.get(False)# A! l5 E$ K% K$ y$ X
非阻塞 q.put(item) 写入队列,timeout等待时间6 O& |; X! p! C; h: ^; l
q.put_nowait(item) 相当q.put(item, False)
6 J2 g& i. B% L- Z# S! K4 R' v6 S# _q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
, S, v, i* A/ e" L+ mq.join() 实际上意味着等到队列为空,再执行别的操作

2 X% Y. [* h  K) p9 E% X代码实例 7810' V) w, }0 f& {) T6 m
  1. import queue
    3 H2 ?2 J) A7 ^5 a  r

  2. * m8 j& t, w4 h" w6 g
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大
    5 f1 a* i2 f2 u" m0 |4 D2 J8 T6 M
  4. print("-------------queue.Queue----------------")
    / l' L, w6 h8 W. K
  5. # 线程消息队列,FIFO(先进先出)0 H  P$ g1 J3 o; T1 L6 ~# q( `% U6 R& C
  6. q = queue.Queue()
    / v$ B# N1 X0 }2 C
  7. q.put("one"): J) Z2 w! Y( y8 c( |7 v; _0 _& c
  8. q.put("two")
      m& ~6 t' r: E$ G+ z
  9. q.put("three")
    3 a  D+ A; i9 q3 ^" `' R* Z2 A+ R
  10. print(q.get())$ I) a( ^/ r, H, _6 N- N9 l
  11. print(q.get())  x. i2 O0 k- I# ?
  12. print(q.get())
    7 C+ O7 i* }9 v/ E  g" z+ |
  13. try:1 x9 m& f- v' D# K+ C( V( h
  14.     # 队列中没有数据, 会阻塞。7 d$ g/ |2 I3 @0 U. r
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常
    $ e* _- n7 {3 S* p9 B
  16.     print(q.get(timeout=3))
    & A  L" A# q, N0 ]; {0 \/ D
  17. except queue.Empty as q_e:- u6 J4 s" W. D! _; \
  18.     print('queue empty')' _5 ?( d: }# j1 ?! N
  19. : R: J3 e) Y$ A8 B$ d& }
  20. print("-------------queue.LifoQueue----------------")
    ) |0 V6 V3 U! n' E( E. _
  21. # 线程消息队列,LIFO(后进先出)' o. e0 S" A8 V& c# l
  22. lq = queue.LifoQueue()9 M# ~7 u8 S7 K' J( [
  23. lq.put("one")
    ' {, W" X8 a* c7 C  `4 g
  24. lq.put("two")
    * G* y1 v7 c: n* F
  25. lq.put("three")
    $ Y; i( I$ N% W7 Z" D. u
  26. print(lq.get())
      `/ g6 ?6 D7 P
  27. print(lq.get())- m! p; N) H) o" [9 Q
  28. print(lq.get())
    $ D/ [) @5 I. w8 Y
  29. ! u, \( V$ n0 m. [
  30. print("-------------queue.PriorityQueue----------------")  g, w8 {" E$ T  b" [9 m
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
    4 m4 q. X, ]' J( d
  32. pq = queue.PriorityQueue()
    , i* N2 U0 O7 B% o
  33. pq.put((1, "Jet"))4 g) W3 C/ A% y* v! P
  34. pq.put((3, "Jack"))
    5 `* U7 d0 ~1 H+ y/ b
  35. pq.put((2, "Judy"))
    % |4 A" i3 Z; Y
  36. print(pq.get())
    : x0 `' ?1 ~, K2 S: D8 S
  37. print(pq.get())
      [7 N# e! g8 X- V3 Z/ ~
  38. print(pq.get())
复制代码

7810.py

1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点

新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新大榭七周年,感谢由您!

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2025-7-4 12:02 , Processed in 0.123486 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表