|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解; t/ ?- b- ]+ v" _
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象
) o* u, v1 C% C: Wimport queue
' T8 X% `/ {: D" y7 ~q = queue.queue(maxsize = 10)$ |9 e/ e) y9 k& ^4 M: F7 m. r
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中" \( f U, R" l) S
q.put(10)
5 M- c. I8 A0 r( c* D2 r调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为 I/ X) q- R" w6 B4 Q$ r
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出7 }6 G7 N' t$ s8 s8 K" q, ]+ k
q.get()# r0 y6 I7 C( d6 Y0 G
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:. J8 {& p% {# L) R T! S; w' x0 ]
1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)
5 g+ B7 z! G8 R' i2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)' k. m, N5 P- s) o3 s
3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):
2 I4 R0 [4 c3 v/ y3 g5 ?7 q q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False( C! D/ O D, P/ B
q.full() 如果队列满了,返回True,反之False$ z1 E: U/ ~, }/ B2 w3 L D
q.full 与 maxsize 大小对应
- J# }0 D$ P* iq.get([block[, timeout]]) 获取队列,timeout等待时间& h9 }2 b2 N7 y2 y8 D* H0 I
q.get_nowait() 相当q.get(False); ]9 o: w% {- O4 R' T- F- ?
非阻塞 q.put(item) 写入队列,timeout等待时间
$ X" ~* f3 p5 A% Uq.put_nowait(item) 相当q.put(item, False)
) e, @9 ]5 B. t1 H5 u/ L. U Rq.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
+ V) x& J5 w- e. J' K! K. |( K/ iq.join() 实际上意味着等到队列为空,再执行别的操作
$ h5 R( l$ ]. H0 E9 j7 v代码实例 7810
$ i- B& T7 l. u( P' M$ W1 u- import queue
% V% L- Y. D$ B S -
0 O; Y4 G3 h. P* J% U - # 以下三个队列都可以设置最大长度maxsize,默认是无限大
; w# i1 r9 ^( G5 o3 B - print("-------------queue.Queue----------------")- I* y9 P' `/ d* W; |2 p
- # 线程消息队列,FIFO(先进先出)9 D( N8 t2 n9 {" K9 W4 o; R9 I5 l
- q = queue.Queue()
" _ l" U) I) r: Z% c7 }2 C - q.put("one"). m6 t6 M$ a. ^9 ?+ H4 }
- q.put("two")3 l* H7 x) s* K: ^7 H) a- a
- q.put("three")
1 H: S' t3 P6 E5 f - print(q.get())
: _- m. O( S" b V5 K4 W - print(q.get())
3 c, L" }4 Q4 m: S' p9 {; Z - print(q.get())+ K s4 v8 O9 G0 B8 l7 s
- try:- |. a) L2 v! P# n
- # 队列中没有数据, 会阻塞。2 x/ W$ }/ W9 ~) L& R! {
- # 阻塞时间到了还没有数据 抛出 queue.Empty 异常2 y& \1 q4 }2 M z
- print(q.get(timeout=3))( S$ r7 {+ S. \
- except queue.Empty as q_e:! B" d9 ]( t2 d- H( l) W
- print('queue empty')- X P8 f) z: E# W* l9 K- [' D5 s' u
-
\, j$ V0 V! _, B- k0 j - print("-------------queue.LifoQueue----------------")
R4 c* r' T& Z - # 线程消息队列,LIFO(后进先出), A( d8 H& u' _% @. e
- lq = queue.LifoQueue()
' F, _$ ~) L7 n" ^+ ~9 ` - lq.put("one")* f. b4 _; a) m
- lq.put("two")3 x8 d* I4 d# r4 i- B& V2 @
- lq.put("three")1 E+ e7 S/ e8 |! q, U$ B3 @ w
- print(lq.get())" P! x2 M% V4 m' x& a* R7 E+ v) N
- print(lq.get())
' ]; H; ~& Z/ C! V4 O - print(lq.get())9 _* U O/ ~# i) ^$ P
-
/ Z/ z: ?* G4 M, j3 x8 K8 G - print("-------------queue.PriorityQueue----------------")
: v9 ` v, f2 V! ]6 C1 q3 v - # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)1 ?1 g% G' |) X) M+ t% I
- pq = queue.PriorityQueue()* k4 R6 c# i2 W3 Q1 H
- pq.put((1, "Jet"))
) n$ Y8 ~* u; @% C# u2 b. x$ b - pq.put((3, "Jack"))6 j2 V* h2 [* r; e# N5 B, j) E, v
- pq.put((2, "Judy"))$ f+ C+ f6 f2 g
- print(pq.get())4 |/ ^0 `, Z/ @* ]
- print(pq.get())
. x) P9 l* F; C5 _# C# R - print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|