新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 282|回复: 0

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

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

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

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

x
Python Queue 模块详解- `/ v' p6 h3 z& Z% r
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象
' t9 {* `* s" h3 l. `import queue
" g7 U2 m! N9 T! ?q = queue.queue(maxsize = 10)1 m, b1 w6 R; s2 ~
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
- p9 U8 [0 Q# K7 B2 {q.put(10)  C- e  M- S) h+ }) c( R
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
! f9 M; d: u3 ~% g1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出' _, z+ }% n# p( }) G5 E1 r* r
q.get()" f3 I) |; J! ]8 ^8 ?
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:/ Z( U: M! |7 o6 ~+ L
1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)
) s3 x* t/ I/ J, H+ r2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)
; j' F* P" O3 c' L- E3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):
& Z" r/ p# l9 O* \/ s# l( u- Y
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False
* q  O9 `. W5 U7 }: l8 Gq.full() 如果队列满了,返回True,反之False
4 D7 W- T5 p# a2 Rq.full 与 maxsize 大小对应3 r( H. [* |. t- s
q.get([block[, timeout]]) 获取队列,timeout等待时间
) N0 W: p8 U, k) g3 R; A* f7 Qq.get_nowait() 相当q.get(False)( P7 l% p2 G  j. A! v* M$ o  k
非阻塞 q.put(item) 写入队列,timeout等待时间
& ]6 N7 ]+ R2 l9 ?8 k0 t8 t! H) ^q.put_nowait(item) 相当q.put(item, False), X7 M& o# O8 y2 F$ @9 M
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号; T+ K- x# ]- Y7 k& M/ k0 a1 f" Z
q.join() 实际上意味着等到队列为空,再执行别的操作
6 y: C$ u5 f8 _  v2 h. x
代码实例 78105 N* ~$ P  P6 }- X+ Y4 L% A
  1. import queue8 R( W; e, X3 ^

  2. & n$ S  d# A' |+ W/ ?, o
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大% `9 k& B! O$ [! U* E$ ?- X) J
  4. print("-------------queue.Queue----------------")2 v7 E7 {2 }- }7 ?, t, ^
  5. # 线程消息队列,FIFO(先进先出)% b! r4 y$ w+ ~# `1 }) F( f
  6. q = queue.Queue()
    1 U. u, T+ V6 |
  7. q.put("one"); G2 s: {/ n4 _) K# O% R
  8. q.put("two")
    ; }1 P( Z( V2 ?! w+ F5 H
  9. q.put("three")7 Q# Y7 Z: I; u9 L; \
  10. print(q.get())
    . w' Q7 C/ h0 L( Y
  11. print(q.get())
    : l5 t( Z+ K$ h4 T7 g
  12. print(q.get())5 e# A' b1 E( N1 ^- `
  13. try:
    ' G( y* f9 X( u8 u  y
  14.     # 队列中没有数据, 会阻塞。, G% @6 K# v% m7 s  Q
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常8 f9 W& A; z* g* x$ G
  16.     print(q.get(timeout=3))" Q/ t$ t9 v. @9 t2 R% p) _3 P8 I
  17. except queue.Empty as q_e:$ Z; ~. t2 G1 Y0 N. \+ \' `, l
  18.     print('queue empty')
    & u' n$ Z: ^+ r' q! {5 S0 B8 V0 K) w

  19. 6 T3 d1 l5 U3 \9 ~' K
  20. print("-------------queue.LifoQueue----------------")1 C( Q0 E5 S) E( [" ?  J
  21. # 线程消息队列,LIFO(后进先出)" U0 N* I# z5 K6 M5 q8 @7 v
  22. lq = queue.LifoQueue(), i( X1 z* c2 s3 H
  23. lq.put("one")
    4 Y: h( S8 e8 }( c! M: O4 w) z
  24. lq.put("two")
    5 G' H1 L: r+ T$ D
  25. lq.put("three")
    2 ~7 W. t6 c/ \! y
  26. print(lq.get())+ G; M4 L+ y( ]+ i" f
  27. print(lq.get())
    4 }2 I! `0 |; W6 K3 p4 o! E  q- l9 h. |
  28. print(lq.get())
    5 q) `' N. ]5 f/ i8 ~( I

  29. 0 v5 M9 `' |% {* b
  30. print("-------------queue.PriorityQueue----------------")
    " U) R& c+ U9 h8 `7 F% J. ]* @4 Y
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)% z; J# a  ~+ ?9 N" n, U/ u2 [
  32. pq = queue.PriorityQueue()7 \  N+ o" S4 e4 l9 h8 A
  33. pq.put((1, "Jet"))2 W* t6 W9 R  V: N, J+ i
  34. pq.put((3, "Jack"))
    3 y1 [4 a: U' I: Z9 A; B
  35. pq.put((2, "Judy"))  A7 ]2 G1 N8 i% E" E, {
  36. print(pq.get())) K/ W" v4 r2 V! H* g
  37. print(pq.get())  v+ F5 K8 W" {+ K0 o. 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, 2026-2-2 11:10 , Processed in 0.094131 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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