|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解
. }# e/ P F6 X: V3 a6 C$ |& ?Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象9 G& t1 B) t! S; ~8 f
import queue
F( Q; A$ H+ W6 o7 eq = queue.queue(maxsize = 10). K( t1 Q9 W: B; K2 y. D% M
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中
2 C9 E4 k2 s [' u9 {9 Cq.put(10)
( j [6 p! z+ |3 v调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为- D `3 G6 |& n0 P& v8 f e+ @
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出
1 T, U. S/ d$ [! [! o/ J6 r4 l- aq.get()
& `3 b( o* A4 J/ p调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:9 B' p: }- \5 N/ h( V3 U
1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)) l2 x0 ]1 l r. l1 }! F) L, l
2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)
f* V5 q: H/ ~0 S7 Y/ i3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):
9 ]: x( `2 C+ |" } q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False+ ^( S1 Q0 q' n2 e8 ^8 B
q.full() 如果队列满了,返回True,反之False
7 a6 M- Y6 T/ j1 zq.full 与 maxsize 大小对应; v* @* [; A( R- k" o* p9 j" ^$ ^
q.get([block[, timeout]]) 获取队列,timeout等待时间
' K" S/ {9 M3 N5 J% pq.get_nowait() 相当q.get(False)
. g; a/ x6 ?- G6 X' x L( X' i非阻塞 q.put(item) 写入队列,timeout等待时间* I1 }5 g, e' }+ D/ e! O
q.put_nowait(item) 相当q.put(item, False)2 V7 B* }$ S4 o; K o3 e$ n# T
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号/ k4 l4 F8 j' T, P/ H" {4 ]
q.join() 实际上意味着等到队列为空,再执行别的操作
# ^; a5 q" ^# ~& e0 P代码实例 7810
# w& u& x) L+ G- import queue
) h2 N2 P e: _1 _7 _1 }5 P+ H9 @, X -
0 r, u d0 n7 d: i4 Z2 z: @ - # 以下三个队列都可以设置最大长度maxsize,默认是无限大
7 s. ~" B" O5 A; x! L - print("-------------queue.Queue----------------")
4 ]: `4 H' `0 y - # 线程消息队列,FIFO(先进先出)+ b0 h- J# r! U* I* r
- q = queue.Queue() V! }& z( z J: _# j' _
- q.put("one")
5 M8 o% b% z& @; ?: ?7 P1 [3 s - q.put("two")3 G, A3 B$ g* g: }- M
- q.put("three")
* G& G$ k- L+ d) W N& x - print(q.get())$ Y# X& [( w N
- print(q.get())
. F$ }4 n! d( E; } - print(q.get())& D M- i8 W4 H4 \
- try:
# j3 ^, d; @6 l: t" ] - # 队列中没有数据, 会阻塞。
" K- X5 Q! x# b( a! d - # 阻塞时间到了还没有数据 抛出 queue.Empty 异常6 O/ m0 Z0 `! Y
- print(q.get(timeout=3))
5 m4 E' j) c8 w7 k) w( s6 N& K - except queue.Empty as q_e:
3 ^8 F: v' \/ B7 k( @6 ^* x - print('queue empty')
" w/ o+ t; C% e- B, l0 }& N, G -
% u% P8 l) f8 }3 F - print("-------------queue.LifoQueue----------------")
0 P% a/ m: c- w" M; N* q* t" r - # 线程消息队列,LIFO(后进先出)$ Q% l8 C2 H' H- Y" f& { Z3 N
- lq = queue.LifoQueue()
" L4 ]! v! C2 P ?8 C8 f - lq.put("one")" O) H& x' T1 I3 E
- lq.put("two")
8 `) |0 m* f9 {: Q8 `9 L - lq.put("three")
: A* b1 k+ j( Q/ a+ U - print(lq.get())% S, [ L% `$ m& s2 a h% ?# ]4 o
- print(lq.get())4 V2 p% }5 n8 y& U4 H! T
- print(lq.get())
+ v$ I6 F3 T( L! Y - - H/ W& z7 A% e- I" V
- print("-------------queue.PriorityQueue----------------")1 a2 L1 ^8 x( L; V# T
- # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
! {- c& g3 e4 q! K - pq = queue.PriorityQueue()9 W* s5 @, |4 k" U# w' d
- pq.put((1, "Jet")) L( V' V7 T8 @! _
- pq.put((3, "Jack"))
F. U" V+ t, K! ?; m5 u; S - pq.put((2, "Judy"))
r! O7 k5 [8 K, Y - print(pq.get())
/ L/ n% c# O3 X; \3 e% s% y3 u - print(pq.get())& X& P& g) K( E
- print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|