|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解
u: }/ j8 m7 X5 w, x' y3 TPython3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象
/ p* v: X I# j8 himport queue/ h& k; P4 F4 J$ V% W( H; s
q = queue.queue(maxsize = 10)2 T3 m2 @, K" t6 C6 v/ S
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中$ h) p# d b, {
q.put(10)& v) d' D9 {; S' r4 N
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为4 p R n% j9 X) j5 W z. {
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出
' L/ Z! C7 Z0 _& D( ^" uq.get()
$ C: _* N/ t. H调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:
, l2 L$ K& p3 a+ Y1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)7 C% N$ J. l7 y/ `& L D
2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)" M/ b: O$ ]" K# F
3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):1 U& _# q! {$ \ K, K, x% \
q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False& E3 f$ }& y0 P# ?7 Q
q.full() 如果队列满了,返回True,反之False/ r, p9 F* ^; O' z0 [& P* @% G
q.full 与 maxsize 大小对应
* @/ ^5 X& {. H/ s1 M5 V) Y- S. Qq.get([block[, timeout]]) 获取队列,timeout等待时间
`5 i I& n% ]$ A, jq.get_nowait() 相当q.get(False)
4 d* o: b" j0 ~4 ]非阻塞 q.put(item) 写入队列,timeout等待时间
' ~" t$ B. c8 b: hq.put_nowait(item) 相当q.put(item, False)
; e. |6 Q4 m* S% c& M/ W2 g/ k. E3 \q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号8 d: L' r6 X* F. K: }" R
q.join() 实际上意味着等到队列为空,再执行别的操作
" ]# f" O+ [2 x+ ~& G) c6 f2 z. c代码实例 7810
& _) i# `6 a; Z" c' {- import queue4 L. n$ @8 o0 Y# `: [* K
- ) a, ~, j) k' P$ S1 x
- # 以下三个队列都可以设置最大长度maxsize,默认是无限大
; B+ }! {$ |3 T0 Z) V - print("-------------queue.Queue----------------")
- m% G8 y5 t+ C - # 线程消息队列,FIFO(先进先出)
) v5 J% {& B* R, \. n( S- o - q = queue.Queue()
5 W: `5 C: N. b; f( {( t - q.put("one")2 h5 k3 v% d) e, V$ V+ D6 o
- q.put("two")
/ g: k2 k- l* c8 e - q.put("three")
4 z( M0 n' H3 j4 m% n# W5 ?$ } - print(q.get())
! D3 O" i& c# J8 d - print(q.get())
: M; }* L8 |! ?6 }' h, v7 h - print(q.get())
9 }/ o+ v, ?* y3 d8 i - try:* b. n* \7 I, I7 ?
- # 队列中没有数据, 会阻塞。9 U1 ]3 f/ `) n
- # 阻塞时间到了还没有数据 抛出 queue.Empty 异常
$ d( k* k7 r% l+ O7 g; m' v) P - print(q.get(timeout=3))
U9 S/ A9 {8 g0 {) L6 n - except queue.Empty as q_e:
# I! y- s- e$ B9 T - print('queue empty')
/ H4 @3 r6 ?$ t - . k7 _+ H& G% _# s+ S, q2 O* o
- print("-------------queue.LifoQueue----------------")
8 c4 Z2 U0 E& F% B" ? - # 线程消息队列,LIFO(后进先出), n$ C' t2 a, O, b; [ Q
- lq = queue.LifoQueue()
' s6 i4 M/ d9 F& c+ ]; p - lq.put("one")
- c0 N& T1 l, [, O; x5 M - lq.put("two")+ m, s* t" L6 ?8 s' }
- lq.put("three")
% S- [- T+ |" Y! a- M - print(lq.get())+ D) J) T0 j) k& z, l& [
- print(lq.get())
# Q& v; n) ~- d& ` - print(lq.get()): P& Q$ y+ F: z6 p7 G6 p
- 8 H+ Y8 w5 B' K' e4 a- E4 d) s1 U: W
- print("-------------queue.PriorityQueue----------------")% w# ^( `! K d; Z9 p( k* o8 c
- # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高): A- d3 B: T& Y& z0 z
- pq = queue.PriorityQueue()
( F" @5 c" b8 J+ A! z - pq.put((1, "Jet"))1 F; ^+ f9 L0 h) i ~% t
- pq.put((3, "Jack"))! W0 }- \0 Y3 `$ D/ }
- pq.put((2, "Judy"))
9 |4 a' }. p4 s - print(pq.get())1 x3 x1 R0 u; B$ m7 N: j* W
- print(pq.get())
5 ]$ g3 U+ s' \) p - print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|