新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 272|回复: 0

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

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

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

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

x
Python Queue 模块详解; t/ ?- b- ]+ v" _
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象
) o* u, v1 C% C: Wimport queue
' T8 X% `/ {: D" y7 ~q = queue.queue(maxsize = 10)$ |9 e/ e) y9 k& ^4 M: F7 m. r
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中" \( f  U, R" l) S
q.put(10)
5 M- c. I8 A0 r( c* D2 r调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为  I/ X) q- R" w6 B4 Q$ r
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出7 }6 G7 N' t$ s8 s8 K" q, ]+ k
q.get()# r0 y6 I7 C( d6 Y0 G
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:. J8 {& p% {# L) R  T! S; w' x0 ]
1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)
5 g+ B7 z! G8 R' i2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)' k. m, N5 P- s) o3 s
3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):
2 I4 R0 [4 c3 v/ y3 g5 ?7 q
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False( C! D/ O  D, P/ B
q.full() 如果队列满了,返回True,反之False$ z1 E: U/ ~, }/ B2 w3 L  D
q.full 与 maxsize 大小对应
- J# }0 D$ P* iq.get([block[, timeout]]) 获取队列,timeout等待时间& h9 }2 b2 N7 y2 y8 D* H0 I
q.get_nowait() 相当q.get(False); ]9 o: w% {- O4 R' T- F- ?
非阻塞 q.put(item) 写入队列,timeout等待时间
$ X" ~* f3 p5 A% Uq.put_nowait(item) 相当q.put(item, False)
) e, @9 ]5 B. t1 H5 u/ L. U  Rq.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
+ V) x& J5 w- e. J' K! K. |( K/ iq.join() 实际上意味着等到队列为空,再执行别的操作

$ h5 R( l$ ]. H0 E9 j7 v代码实例 7810
$ i- B& T7 l. u( P' M$ W1 u
  1. import queue
    % V% L- Y. D$ B  S

  2. 0 O; Y4 G3 h. P* J% U
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大
    ; w# i1 r9 ^( G5 o3 B
  4. print("-------------queue.Queue----------------")- I* y9 P' `/ d* W; |2 p
  5. # 线程消息队列,FIFO(先进先出)9 D( N8 t2 n9 {" K9 W4 o; R9 I5 l
  6. q = queue.Queue()
    " _  l" U) I) r: Z% c7 }2 C
  7. q.put("one"). m6 t6 M$ a. ^9 ?+ H4 }
  8. q.put("two")3 l* H7 x) s* K: ^7 H) a- a
  9. q.put("three")
    1 H: S' t3 P6 E5 f
  10. print(q.get())
    : _- m. O( S" b  V5 K4 W
  11. print(q.get())
    3 c, L" }4 Q4 m: S' p9 {; Z
  12. print(q.get())+ K  s4 v8 O9 G0 B8 l7 s
  13. try:- |. a) L2 v! P# n
  14.     # 队列中没有数据, 会阻塞。2 x/ W$ }/ W9 ~) L& R! {
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常2 y& \1 q4 }2 M  z
  16.     print(q.get(timeout=3))( S$ r7 {+ S. \
  17. except queue.Empty as q_e:! B" d9 ]( t2 d- H( l) W
  18.     print('queue empty')- X  P8 f) z: E# W* l9 K- [' D5 s' u

  19.   \, j$ V0 V! _, B- k0 j
  20. print("-------------queue.LifoQueue----------------")
      R4 c* r' T& Z
  21. # 线程消息队列,LIFO(后进先出), A( d8 H& u' _% @. e
  22. lq = queue.LifoQueue()
    ' F, _$ ~) L7 n" ^+ ~9 `
  23. lq.put("one")* f. b4 _; a) m
  24. lq.put("two")3 x8 d* I4 d# r4 i- B& V2 @
  25. lq.put("three")1 E+ e7 S/ e8 |! q, U$ B3 @  w
  26. print(lq.get())" P! x2 M% V4 m' x& a* R7 E+ v) N
  27. print(lq.get())
    ' ]; H; ~& Z/ C! V4 O
  28. print(lq.get())9 _* U  O/ ~# i) ^$ P

  29. / Z/ z: ?* G4 M, j3 x8 K8 G
  30. print("-------------queue.PriorityQueue----------------")
    : v9 `  v, f2 V! ]6 C1 q3 v
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)1 ?1 g% G' |) X) M+ t% I
  32. pq = queue.PriorityQueue()* k4 R6 c# i2 W3 Q1 H
  33. pq.put((1, "Jet"))
    ) n$ Y8 ~* u; @% C# u2 b. x$ b
  34. pq.put((3, "Jack"))6 j2 V* h2 [* r; e# N5 B, j) E, v
  35. pq.put((2, "Judy"))$ f+ C+ f6 f2 g
  36. print(pq.get())4 |/ ^0 `, Z/ @* ]
  37. print(pq.get())
    . x) P9 l* F; C5 _# C# R
  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, 2026-1-12 10:03 , Processed in 0.091370 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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