新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 259|回复: 0

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

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

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

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

x
Python Queue 模块详解2 k1 b. e9 J' {+ h  A" C( L
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象
/ x" F; g+ [7 R9 ?import queue$ i9 `7 Z0 m& E5 B9 T% w- f1 R
q = queue.queue(maxsize = 10)* u& K# _5 Y+ n# N$ k
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
% o) u1 K( `" Xq.put(10)1 U* i/ G1 g  L2 w; m0 ]1 p6 M( C
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
- |& B5 e3 T% W1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出9 O3 r& R* Z, w$ B( g# `8 w
q.get()
7 j/ ~! k2 F( Y( {3 Y- E6 Y. `% e: N调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:: ?2 V$ ?8 e! v; s; |, C
1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)0 ^& q! J" T2 {( i; ]
2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)
1 U2 k  u$ r2 j7 @5 {9 i, `) Z3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):
- C3 X* m6 k  w+ D. e. O) A; H2 t
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False
1 E5 S8 \$ H# U3 U% g6 t5 E$ Y! Zq.full() 如果队列满了,返回True,反之False: I6 t3 F$ R( Y+ B7 i* A  B
q.full 与 maxsize 大小对应
5 u! u' v* p1 @: lq.get([block[, timeout]]) 获取队列,timeout等待时间
5 [1 o; `4 D6 y, g: ]) pq.get_nowait() 相当q.get(False)3 p; E1 j( Y8 q. B/ O2 J
非阻塞 q.put(item) 写入队列,timeout等待时间
1 S1 A9 ], }: Z* z: S" Vq.put_nowait(item) 相当q.put(item, False)  H% h2 G/ ?, S, @# U9 y
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
" {/ a9 s' M2 r5 p* I6 o; Aq.join() 实际上意味着等到队列为空,再执行别的操作
5 g6 |  b/ F4 Z" `! t$ k
代码实例 7810
9 u/ D/ Z% p  N7 U3 u2 Z' [
  1. import queue
    & g7 L" W# g# `1 y8 h1 w

  2. " q4 Q# C5 }3 f$ g  u
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大1 J, d; }1 x( v4 |1 p
  4. print("-------------queue.Queue----------------")
    ; O5 t8 r0 x; e. i' j( U. K
  5. # 线程消息队列,FIFO(先进先出)
    ) B8 e, g. a5 n- n& n3 ~4 X( c! U
  6. q = queue.Queue()
    % ^% b& ^6 {& b, [2 @
  7. q.put("one")6 ?7 l* W; Y, K* Z
  8. q.put("two")
    2 r! k8 X9 T: a  B9 W% Y: p  Q) K
  9. q.put("three")# i% c& ^4 ]9 {) {% ~
  10. print(q.get())+ m2 b4 U' b9 G- z
  11. print(q.get())
    ; c; `, w9 A  I! t
  12. print(q.get())1 Z2 ?. l+ n& |7 R
  13. try:2 y: D. j* M' j7 a; i+ r& U
  14.     # 队列中没有数据, 会阻塞。
    # Q& _% O% c" F
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常7 Y9 @* M9 o# F" G
  16.     print(q.get(timeout=3))
    1 H6 P. y. a5 _. x7 \3 k
  17. except queue.Empty as q_e:& ]+ z7 e' y8 I- P, p8 O  y+ |. b
  18.     print('queue empty')
    5 q% ]$ p+ v6 b4 F4 |' B4 [, h) j4 H6 M2 W
  19. & X6 g8 |% m3 T* [0 u
  20. print("-------------queue.LifoQueue----------------")/ {& g+ j) s( T9 u/ [- \1 [
  21. # 线程消息队列,LIFO(后进先出)2 N  U# M! D+ U/ `) d( N; C
  22. lq = queue.LifoQueue()
    ( P1 Q9 d) q' _& M
  23. lq.put("one")
    ' Y; J/ R1 q, p6 ~
  24. lq.put("two")
    ! F/ i2 c1 n( C1 h* x# l/ Q
  25. lq.put("three")3 C6 h0 ?, ~) g7 b/ I
  26. print(lq.get())$ c; u7 k3 m. a: R
  27. print(lq.get())# ]0 x5 q6 ]3 {1 U% H  t
  28. print(lq.get())
      P& l* c( W# _  X& w

  29. ( j% \2 O* N! s
  30. print("-------------queue.PriorityQueue----------------")( B& J6 ~4 r$ L0 V- I, A5 Y& [
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
    7 J  Q' M, X9 j% l5 m
  32. pq = queue.PriorityQueue()
    " I) Z/ \; q# ^+ q& t: _
  33. pq.put((1, "Jet"))3 i$ O4 `: t* _5 Q
  34. pq.put((3, "Jack"))
    5 a( q. ^& F5 J9 ]6 s2 d* D
  35. pq.put((2, "Judy"))
    6 M6 s/ W4 n: C# v3 V
  36. print(pq.get())
    . }( y% H+ a' E/ s: C# S
  37. print(pq.get())/ C9 F6 r$ A1 T, g$ p
  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-11-23 21:45 , Processed in 0.089118 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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