|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解
- e+ m% \8 h; V5 x5 k9 l- T) B+ cPython3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象7 \0 I5 n( @* g" ^7 T
import queue& @) w2 z) C0 n% C* r8 d( ?) w: w; o
q = queue.queue(maxsize = 10)9 S+ S5 w% [3 A k+ Z9 O" j# P
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中0 ^8 n9 m+ X4 b$ K$ T9 A
q.put(10)
2 F) i' s% M/ f# r0 w- {调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
6 R0 H$ T4 H# u c# R1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出
8 i" }5 s0 B4 {& Uq.get()
" n2 v( Y# R. W7 E调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:
; N1 P* c: B N X* [+ C1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)+ E7 @; a& E) s
2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)# Y% X Y. K8 i9 M& A
3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):6 y- @+ E* z% R
q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False( v2 ^/ z9 `# Q0 t' i
q.full() 如果队列满了,返回True,反之False5 m" x$ R. O4 H; L/ y
q.full 与 maxsize 大小对应
1 I4 o7 Q5 W. f) T" T) Wq.get([block[, timeout]]) 获取队列,timeout等待时间# I* M+ E- ~+ S% C
q.get_nowait() 相当q.get(False)
8 A' d) C( e7 i0 u' g9 s1 k非阻塞 q.put(item) 写入队列,timeout等待时间# e& ]4 V1 J8 V3 i F8 A
q.put_nowait(item) 相当q.put(item, False)
3 |! K6 U2 u- l% mq.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号( ]4 \0 M* e) k K1 q8 S% f
q.join() 实际上意味着等到队列为空,再执行别的操作
2 }+ `& n# t3 B$ M; c0 j代码实例 78108 l+ E, H! x8 L, M# _' n
- import queue
9 J, f2 N* H7 w2 V3 o - 5 b, i( B" L7 s U7 F
- # 以下三个队列都可以设置最大长度maxsize,默认是无限大" A/ G9 A6 i. n0 b: H0 P
- print("-------------queue.Queue----------------")
: } B1 C8 ~* S) A( ?. l6 Z - # 线程消息队列,FIFO(先进先出)3 K% F/ X' y( l$ |; j% H
- q = queue.Queue()! v: t; b& m7 {! [, ]6 \8 H/ p
- q.put("one")" w( o# i* v) k) l6 L% \
- q.put("two")
R' a( ^# R; J6 A# e - q.put("three")
4 a8 e( t: y! }) n6 b - print(q.get())( J2 n* Z$ h' N7 u9 V; F5 o; y
- print(q.get())
) x$ Y* h- _" {% T - print(q.get())+ t( D% O/ H5 E1 T& \
- try:
# j: S. X" A: F) W) U4 \ - # 队列中没有数据, 会阻塞。
: @+ X6 ?% q& t! e0 t - # 阻塞时间到了还没有数据 抛出 queue.Empty 异常( `5 a" ~$ k W4 R
- print(q.get(timeout=3))
/ E) H1 Q( q v: B+ [ - except queue.Empty as q_e:
- `5 F% v, r. e( z" v' u - print('queue empty')
7 U; J2 W2 q3 Q+ L - 4 n. T. n# V1 H, r# Y
- print("-------------queue.LifoQueue----------------")5 l; ^1 u; C s/ Y \" S
- # 线程消息队列,LIFO(后进先出)
& P# r2 ?1 Q' U1 f! {7 { - lq = queue.LifoQueue()* ?! {1 x1 m/ s2 {1 O3 \" Q, K
- lq.put("one")1 X+ C. z, s0 K' y d6 o
- lq.put("two")
, p1 w9 z. s' W - lq.put("three")$ ~8 z. O# E; j( H$ b* ]
- print(lq.get())
; ]; R: g$ S6 X# w% j - print(lq.get())
4 e! `3 N5 W1 f" n) d - print(lq.get())
d0 Y$ \, ~" k4 ~6 h* Z6 D - " q8 G2 W( ?: |( X) ?
- print("-------------queue.PriorityQueue----------------")
+ i( X. J# T- Y6 G! D1 W2 W - # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)) R. N: F5 M$ Y- d% k1 a! g
- pq = queue.PriorityQueue()! L6 p! m7 [4 Q6 n1 z$ f' X$ ^
- pq.put((1, "Jet"))
$ X) I& d6 @9 D3 ]7 x; @ - pq.put((3, "Jack"))
8 s' m! @' o1 t' z9 { - pq.put((2, "Judy"))6 V- L' H ` n
- print(pq.get())6 {, T/ o* |0 u' t% \: m
- print(pq.get())3 J. a) B2 |" C. ^& A- K$ R
- print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|