新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

新大榭软件管家 V5.8 Excel版 微信版 发布 财务/仓库/生产/销售/采购/行政/人事/校园 客服中心 - 办公软件 - 网站设计 - 广告招商

新大榭镜像 - 官方Web实验室 - 加入收藏 - 设为首页 广告是为了更好的发展 欢迎我区企业及商家赞助本站 首页文字黄金广告位(赞助)公益广告免费发布

查看: 158|回复: 0

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

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

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

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

x
Python Queue 模块详解
+ k7 T- u; L0 z; @( T
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象& k  V6 V  m9 y6 P# T/ t% O5 H
import queue
. ~4 M* J5 r6 V: Nq = queue.queue(maxsize = 10)$ E5 C- g4 Q+ Q& h: |7 ~! Z
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
4 w0 {. ^& [3 B3 p# H- rq.put(10)
& [4 F' i) A4 N! E, S调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
8 g" A6 X: G! o+ z9 o" C1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出
& H# a1 Y, |; ]+ Vq.get()
: Q) a# {, C+ A/ j# A3 U调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:
- A2 [5 R0 s$ L$ |# ^5 q% {+ @. Z' C1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)
! }! T7 N0 m5 l, B3 ~0 v, c: Y2 M7 F2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)- {4 q; o! }' ]6 o# m
3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):. R0 U8 @/ [* c% ]4 k, ~5 V
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False
5 g8 T7 T$ o3 C  P. u; yq.full() 如果队列满了,返回True,反之False. G6 ~/ t8 f9 \  X4 l
q.full 与 maxsize 大小对应
( `3 ?1 P9 `, \) U9 `, Oq.get([block[, timeout]]) 获取队列,timeout等待时间
+ S, u7 |( r0 U; K$ |& ]5 D& U8 K% |# @q.get_nowait() 相当q.get(False)
$ V4 a. u0 t, l" l7 A非阻塞 q.put(item) 写入队列,timeout等待时间! V% Q8 A& G+ h+ n1 @& ^' j* h
q.put_nowait(item) 相当q.put(item, False)
8 `" n! M& ?* xq.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号+ M2 F7 M- f1 a5 ~
q.join() 实际上意味着等到队列为空,再执行别的操作

+ H' U+ a3 x; \2 e2 h代码实例 7810
9 t, Q2 t1 w: Z3 D
  1. import queue. c; D- B6 x/ g0 B' X- F
  2. 1 L+ k2 O9 P" N. c( i$ W
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大
    ; v) f! p" h4 y0 ~8 _& m
  4. print("-------------queue.Queue----------------")
    : g" u0 Y5 [0 ]" c) T7 \+ N
  5. # 线程消息队列,FIFO(先进先出)
    8 Z$ L) L' [+ d$ z% P$ U% ]9 f: v
  6. q = queue.Queue()
    # e* h* {3 w: }
  7. q.put("one")6 h( J; Q* o. ]9 u' l  W
  8. q.put("two")4 {# X0 K4 W9 S3 T: ?
  9. q.put("three")$ M: ^/ x# G. g
  10. print(q.get())
    1 g9 K& Q- X  G
  11. print(q.get())- W( G& ~1 ^! S2 v5 U6 K
  12. print(q.get())
    % c# t* e, [6 d
  13. try:
    ! G. A8 x& G$ R8 n
  14.     # 队列中没有数据, 会阻塞。" Q  ~0 f5 A% P6 c
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常. E) y" a9 a% w* n! c( `
  16.     print(q.get(timeout=3)). Q3 I" B5 i' s( [. k* c
  17. except queue.Empty as q_e:8 r) z" o6 k/ J& i
  18.     print('queue empty')
    ) B' j' }/ R- z% U* Y8 ^
  19. : _( L! z% [- Z% I0 {% j
  20. print("-------------queue.LifoQueue----------------")0 r! ^. y; i6 z. H4 W
  21. # 线程消息队列,LIFO(后进先出)
    8 [) r1 M# m- K. j4 Y2 F
  22. lq = queue.LifoQueue()
    6 [  X8 {/ Y" G
  23. lq.put("one")0 V" D& M/ `1 |
  24. lq.put("two")" o9 ]& ^0 l3 z! e' F1 Z
  25. lq.put("three")" `4 Z+ w% R. [! G
  26. print(lq.get())$ q# p9 `+ \+ p( v& T0 \
  27. print(lq.get()): R: M/ \4 m+ A$ W  d. g/ y
  28. print(lq.get())
    $ c; n$ m% G( t* U
  29. ) ]. ^9 P: x' B* x& l! W) s5 b
  30. print("-------------queue.PriorityQueue----------------")# q. v$ ]- q8 ?/ x
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
    : P5 V, W  _; |; i, t5 G7 n
  32. pq = queue.PriorityQueue(), U* J. d9 v4 c. H
  33. pq.put((1, "Jet"))7 F1 R! a- D+ Y! _
  34. pq.put((3, "Jack"))( Q4 w! [% W" {7 j+ u) g
  35. pq.put((2, "Judy"))/ T0 M; E8 a! C/ B' s* J
  36. print(pq.get())
    1 \! ~2 R/ Y  B& [4 e8 `
  37. print(pq.get())
    , t6 J! |9 Q$ R1 N
  38. print(pq.get())
复制代码

7810.py

1002 Bytes, 下载次数: 15

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

本版积分规则

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

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

GMT+8, 2024-5-19 13:06 , Processed in 0.069163 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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