新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 299|回复: 0

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

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

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

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

x
Python Queue 模块详解
2 ]' O8 C" j4 ~* m: R- k
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
创建一个“队列”对象8 i, x" D7 y% a, Y6 Q% d5 V6 `
import queue
! A9 l" u6 F0 oq = queue.queue(maxsize = 10)
4 P9 p# }  ^- R6 Gqueue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
* n2 N! q5 _! L9 m  B$ y  L2 k/ C, {q.put(10)# I3 g4 Q3 W1 C3 U/ J
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
! V% j9 z7 O* p7 Q& V8 l! a1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出  {2 |% ~9 ^. D4 F+ w
q.get()
5 J& ?0 ^' D/ x' H* D1 j调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Python queue模块有三种队列及构造函数:8 ?+ N3 F$ _" r) ?1 n1 @' u
1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)
6 I: [% L8 t4 B% r# b1 B" y2、LIFO类似于堆,即先进后出。                         class queue.Lifoqueue(maxsize)2 q3 q9 A( W. o
3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)
此包中的常用方法(q =queue.queue()):+ s$ w2 X2 ~" f) V3 i" s! x
q.qsize() 返回队列的大小,即输出队列中元素的个数
q.queue.queue(5) 建立一个长度为5的队列q
q.put(5) 将数字5入队
q.get() 队首元素出队
q.empty() 如果队列为空,返回True,反之False
7 E& ~- P1 Q! B* H$ v2 h& f& sq.full() 如果队列满了,返回True,反之False5 e0 j; g. x  g9 P1 _: Q# X
q.full 与 maxsize 大小对应1 @, h5 s$ J: a7 |* l( ~
q.get([block[, timeout]]) 获取队列,timeout等待时间
/ p9 w9 f% J- G8 g2 K% E- Wq.get_nowait() 相当q.get(False)1 c% I# F. ~0 n! f" W" G( Y
非阻塞 q.put(item) 写入队列,timeout等待时间
( o; C0 l# v. r9 X9 `! Rq.put_nowait(item) 相当q.put(item, False)
1 n& c1 i( n; ]( D6 oq.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号; s' T" C0 T  E% f& ]
q.join() 实际上意味着等到队列为空,再执行别的操作
  a6 I5 L1 ~5 P! t9 {
代码实例 7810% ?4 ~; t: ?" ?9 o( d. ]1 x* U
  1. import queue0 y* f! R9 L7 w1 Z# O
  2. " n3 ?+ x$ ]. K
  3. # 以下三个队列都可以设置最大长度maxsize,默认是无限大
    6 o" I5 ^# a9 C! O8 a0 I
  4. print("-------------queue.Queue----------------")# D: L: A( G  w; N( w+ \
  5. # 线程消息队列,FIFO(先进先出)# G, K" Q. U7 V  L- e# U. l" y
  6. q = queue.Queue()
    6 y" W% S8 U1 a5 L9 _
  7. q.put("one")
    % W+ }) b# u0 F( n
  8. q.put("two")2 b! ~/ c# f. b& n; O' k0 O) `
  9. q.put("three")( g! Z$ x8 |1 f" a6 i  v
  10. print(q.get())
    ( N! C+ P2 g9 V2 L4 T3 E1 n3 l
  11. print(q.get())
    : w4 [( f* u7 X3 p0 @
  12. print(q.get())- z( g1 t5 P$ x" l6 c$ X) s* p
  13. try:
    + q% ?& ]6 G" x
  14.     # 队列中没有数据, 会阻塞。: v" m; Z$ C$ g8 P: j
  15.     # 阻塞时间到了还没有数据 抛出 queue.Empty 异常4 O: ^( j  s0 d% \% \1 y
  16.     print(q.get(timeout=3))9 a8 x6 f( {! q! B  |- J
  17. except queue.Empty as q_e:8 Q% X2 \( b4 [8 f
  18.     print('queue empty')
    0 {% N/ }; G' Y- @4 H3 s
  19. 4 n, o1 P% [6 ^& c8 |- t( Q4 X/ K
  20. print("-------------queue.LifoQueue----------------")" J1 \4 f5 d' P' w9 u
  21. # 线程消息队列,LIFO(后进先出)
    # J; ]+ L3 E+ Y6 Y; c6 I
  22. lq = queue.LifoQueue()
    8 P+ o: u& Z+ `6 ~. {* s" y- q& S0 P
  23. lq.put("one")
    0 K0 ]$ X: l# p- N; j
  24. lq.put("two")
    7 w& a( }* [  B, i' C6 y
  25. lq.put("three")
    8 [6 e) D9 e% S6 I  [6 ^% ^9 O' P
  26. print(lq.get())
    * H# e. q# o5 F( D$ h: s
  27. print(lq.get())
    . G8 {5 ~& S* f) K) [* U
  28. print(lq.get())' n3 i: H$ ]2 [! x7 d( B

  29. : L7 ]8 Q$ r% G, [) O9 K" k
  30. print("-------------queue.PriorityQueue----------------")
    7 V, Z2 O3 Y# B5 q" ?
  31. # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
      v' m4 N$ X: T6 L3 O: d
  32. pq = queue.PriorityQueue()3 c: N2 U# V5 S- r& [; g  J0 \
  33. pq.put((1, "Jet"))" C  F* i6 P( Q) @8 A: }: O
  34. pq.put((3, "Jack"))
      o; i3 m+ H0 C1 b3 ?- l. B% m
  35. pq.put((2, "Judy"))
    ! n5 \  B& G& c9 u) j2 P" b
  36. print(pq.get())9 j8 }9 G6 @5 O5 _2 f# ?
  37. print(pq.get())
    . [% B& f) _' D4 D9 ?! a
  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-3-2 15:45 , Processed in 0.099369 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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