新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 278|回复: 0

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

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

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

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

x
Python Queue 模块详解
  u: }/ j8 m7 X5 w, x' y3 T
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象
/ p* v: X  I# j8 himport queue/ h& k; P4 F4 J$ V% W( H; s
q = queue.queue(maxsize = 10)2 T3 m2 @, K" t6 C6 v/ S
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中$ h) p# d  b, {
q.put(10)& v) d' D9 {; S' r4 N
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为4 p  R  n% j9 X) j5 W  z. {
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出
' L/ Z! C7 Z0 _& D( ^" uq.get()
$ C: _* N/ t. H调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:
, l2 L$ K& p3 a+ Y1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)7 C% N$ J. l7 y/ `& L  D
2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)" M/ b: O$ ]" K# F
3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):1 U& _# q! {$ \  K, K, x% \
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False& E3 f$ }& y0 P# ?7 Q
q.full() 如果队列满了,返回True,反之False/ r, p9 F* ^; O' z0 [& P* @% G
q.full 与 maxsize 大小对应
* @/ ^5 X& {. H/ s1 M5 V) Y- S. Qq.get([block[, timeout]]) 获取队列,timeout等待时间
  `5 i  I& n% ]$ A, jq.get_nowait() 相当q.get(False)
4 d* o: b" j0 ~4 ]非阻塞 q.put(item) 写入队列,timeout等待时间
' ~" t$ B. c8 b: hq.put_nowait(item) 相当q.put(item, False)
; e. |6 Q4 m* S% c& M/ W2 g/ k. E3 \q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号8 d: L' r6 X* F. K: }" R
q.join() 实际上意味着等到队列为空,再执行别的操作

" ]# f" O+ [2 x+ ~& G) c6 f2 z. c代码实例 7810
& _) i# `6 a; Z" c' {
  1. import queue4 L. n$ @8 o0 Y# `: [* K
  2. ) a, ~, j) k' P$ S1 x
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大
    ; B+ }! {$ |3 T0 Z) V
  4. print("-------------queue.Queue----------------")
    - m% G8 y5 t+ C
  5. # 线程消息队列,FIFO(先进先出)
    ) v5 J% {& B* R, \. n( S- o
  6. q = queue.Queue()
    5 W: `5 C: N. b; f( {( t
  7. q.put("one")2 h5 k3 v% d) e, V$ V+ D6 o
  8. q.put("two")
    / g: k2 k- l* c8 e
  9. q.put("three")
    4 z( M0 n' H3 j4 m% n# W5 ?$ }
  10. print(q.get())
    ! D3 O" i& c# J8 d
  11. print(q.get())
    : M; }* L8 |! ?6 }' h, v7 h
  12. print(q.get())
    9 }/ o+ v, ?* y3 d8 i
  13. try:* b. n* \7 I, I7 ?
  14.     # 队列中没有数据, 会阻塞。9 U1 ]3 f/ `) n
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常
    $ d( k* k7 r% l+ O7 g; m' v) P
  16.     print(q.get(timeout=3))
      U9 S/ A9 {8 g0 {) L6 n
  17. except queue.Empty as q_e:
    # I! y- s- e$ B9 T
  18.     print('queue empty')
    / H4 @3 r6 ?$ t
  19. . k7 _+ H& G% _# s+ S, q2 O* o
  20. print("-------------queue.LifoQueue----------------")
    8 c4 Z2 U0 E& F% B" ?
  21. # 线程消息队列,LIFO(后进先出), n$ C' t2 a, O, b; [  Q
  22. lq = queue.LifoQueue()
    ' s6 i4 M/ d9 F& c+ ]; p
  23. lq.put("one")
    - c0 N& T1 l, [, O; x5 M
  24. lq.put("two")+ m, s* t" L6 ?8 s' }
  25. lq.put("three")
    % S- [- T+ |" Y! a- M
  26. print(lq.get())+ D) J) T0 j) k& z, l& [
  27. print(lq.get())
    # Q& v; n) ~- d& `
  28. print(lq.get()): P& Q$ y+ F: z6 p7 G6 p
  29. 8 H+ Y8 w5 B' K' e4 a- E4 d) s1 U: W
  30. print("-------------queue.PriorityQueue----------------")% w# ^( `! K  d; Z9 p( k* o8 c
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高): A- d3 B: T& Y& z0 z
  32. pq = queue.PriorityQueue()
    ( F" @5 c" b8 J+ A! z
  33. pq.put((1, "Jet"))1 F; ^+ f9 L0 h) i  ~% t
  34. pq.put((3, "Jack"))! W0 }- \0 Y3 `$ D/ }
  35. pq.put((2, "Judy"))
    9 |4 a' }. p4 s
  36. print(pq.get())1 x3 x1 R0 u; B$ m7 N: j* W
  37. print(pq.get())
    5 ]$ g3 U+ s' \) 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, 2026-1-26 09:24 , Processed in 0.096888 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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