|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解
2 ]' O8 C" j4 ~* m: R- kPython3中队列是线程间最常用的交换数据的形式。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.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
- import queue0 y* f! R9 L7 w1 Z# O
- " n3 ?+ x$ ]. K
- # 以下三个队列都可以设置最大长度maxsize,默认是无限大
6 o" I5 ^# a9 C! O8 a0 I - print("-------------queue.Queue----------------")# D: L: A( G w; N( w+ \
- # 线程消息队列,FIFO(先进先出)# G, K" Q. U7 V L- e# U. l" y
- q = queue.Queue()
6 y" W% S8 U1 a5 L9 _ - q.put("one")
% W+ }) b# u0 F( n - q.put("two")2 b! ~/ c# f. b& n; O' k0 O) `
- q.put("three")( g! Z$ x8 |1 f" a6 i v
- print(q.get())
( N! C+ P2 g9 V2 L4 T3 E1 n3 l - print(q.get())
: w4 [( f* u7 X3 p0 @ - print(q.get())- z( g1 t5 P$ x" l6 c$ X) s* p
- try:
+ q% ?& ]6 G" x - # 队列中没有数据, 会阻塞。: v" m; Z$ C$ g8 P: j
- # 阻塞时间到了还没有数据 抛出 queue.Empty 异常4 O: ^( j s0 d% \% \1 y
- print(q.get(timeout=3))9 a8 x6 f( {! q! B |- J
- except queue.Empty as q_e:8 Q% X2 \( b4 [8 f
- print('queue empty')
0 {% N/ }; G' Y- @4 H3 s - 4 n, o1 P% [6 ^& c8 |- t( Q4 X/ K
- print("-------------queue.LifoQueue----------------")" J1 \4 f5 d' P' w9 u
- # 线程消息队列,LIFO(后进先出)
# J; ]+ L3 E+ Y6 Y; c6 I - lq = queue.LifoQueue()
8 P+ o: u& Z+ `6 ~. {* s" y- q& S0 P - lq.put("one")
0 K0 ]$ X: l# p- N; j - lq.put("two")
7 w& a( }* [ B, i' C6 y - lq.put("three")
8 [6 e) D9 e% S6 I [6 ^% ^9 O' P - print(lq.get())
* H# e. q# o5 F( D$ h: s - print(lq.get())
. G8 {5 ~& S* f) K) [* U - print(lq.get())' n3 i: H$ ]2 [! x7 d( B
-
: L7 ]8 Q$ r% G, [) O9 K" k - print("-------------queue.PriorityQueue----------------")
7 V, Z2 O3 Y# B5 q" ? - # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
v' m4 N$ X: T6 L3 O: d - pq = queue.PriorityQueue()3 c: N2 U# V5 S- r& [; g J0 \
- pq.put((1, "Jet"))" C F* i6 P( Q) @8 A: }: O
- pq.put((3, "Jack"))
o; i3 m+ H0 C1 b3 ?- l. B% m - pq.put((2, "Judy"))
! n5 \ B& G& c9 u) j2 P" b - print(pq.get())9 j8 }9 G6 @5 O5 _2 f# ?
- print(pq.get())
. [% B& f) _' D4 D9 ?! a - print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|