|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解- `/ v' p6 h3 z& Z% r
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象
' t9 {* `* s" h3 l. `import queue
" g7 U2 m! N9 T! ?q = queue.queue(maxsize = 10)1 m, b1 w6 R; s2 ~
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中
- p9 U8 [0 Q# K7 B2 {q.put(10) C- e M- S) h+ }) c( R
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
! f9 M; d: u3 ~% g1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出' _, z+ }% n# p( }) G5 E1 r* r
q.get()" f3 I) |; J! ]8 ^8 ?
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:/ Z( U: M! |7 o6 ~+ L
1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)
) s3 x* t/ I/ J, H+ r2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)
; j' F* P" O3 c' L- E3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):
& Z" r/ p# l9 O* \/ s# l( u- Y q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False
* q O9 `. W5 U7 }: l8 Gq.full() 如果队列满了,返回True,反之False
4 D7 W- T5 p# a2 Rq.full 与 maxsize 大小对应3 r( H. [* |. t- s
q.get([block[, timeout]]) 获取队列,timeout等待时间
) N0 W: p8 U, k) g3 R; A* f7 Qq.get_nowait() 相当q.get(False)( P7 l% p2 G j. A! v* M$ o k
非阻塞 q.put(item) 写入队列,timeout等待时间
& ]6 N7 ]+ R2 l9 ?8 k0 t8 t! H) ^q.put_nowait(item) 相当q.put(item, False), X7 M& o# O8 y2 F$ @9 M
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号; T+ K- x# ]- Y7 k& M/ k0 a1 f" Z
q.join() 实际上意味着等到队列为空,再执行别的操作
6 y: C$ u5 f8 _ v2 h. x
代码实例 78105 N* ~$ P P6 }- X+ Y4 L% A
- import queue8 R( W; e, X3 ^
-
& n$ S d# A' |+ W/ ?, o - # 以下三个队列都可以设置最大长度maxsize,默认是无限大% `9 k& B! O$ [! U* E$ ?- X) J
- print("-------------queue.Queue----------------")2 v7 E7 {2 }- }7 ?, t, ^
- # 线程消息队列,FIFO(先进先出)% b! r4 y$ w+ ~# `1 }) F( f
- q = queue.Queue()
1 U. u, T+ V6 | - q.put("one"); G2 s: {/ n4 _) K# O% R
- q.put("two")
; }1 P( Z( V2 ?! w+ F5 H - q.put("three")7 Q# Y7 Z: I; u9 L; \
- print(q.get())
. w' Q7 C/ h0 L( Y - print(q.get())
: l5 t( Z+ K$ h4 T7 g - print(q.get())5 e# A' b1 E( N1 ^- `
- try:
' G( y* f9 X( u8 u y - # 队列中没有数据, 会阻塞。, G% @6 K# v% m7 s Q
- # 阻塞时间到了还没有数据 抛出 queue.Empty 异常8 f9 W& A; z* g* x$ G
- print(q.get(timeout=3))" Q/ t$ t9 v. @9 t2 R% p) _3 P8 I
- except queue.Empty as q_e:$ Z; ~. t2 G1 Y0 N. \+ \' `, l
- print('queue empty')
& u' n$ Z: ^+ r' q! {5 S0 B8 V0 K) w -
6 T3 d1 l5 U3 \9 ~' K - print("-------------queue.LifoQueue----------------")1 C( Q0 E5 S) E( [" ? J
- # 线程消息队列,LIFO(后进先出)" U0 N* I# z5 K6 M5 q8 @7 v
- lq = queue.LifoQueue(), i( X1 z* c2 s3 H
- lq.put("one")
4 Y: h( S8 e8 }( c! M: O4 w) z - lq.put("two")
5 G' H1 L: r+ T$ D - lq.put("three")
2 ~7 W. t6 c/ \! y - print(lq.get())+ G; M4 L+ y( ]+ i" f
- print(lq.get())
4 }2 I! `0 |; W6 K3 p4 o! E q- l9 h. | - print(lq.get())
5 q) `' N. ]5 f/ i8 ~( I -
0 v5 M9 `' |% {* b - print("-------------queue.PriorityQueue----------------")
" U) R& c+ U9 h8 `7 F% J. ]* @4 Y - # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)% z; J# a ~+ ?9 N" n, U/ u2 [
- pq = queue.PriorityQueue()7 \ N+ o" S4 e4 l9 h8 A
- pq.put((1, "Jet"))2 W* t6 W9 R V: N, J+ i
- pq.put((3, "Jack"))
3 y1 [4 a: U' I: Z9 A; B - pq.put((2, "Judy")) A7 ]2 G1 N8 i% E" E, {
- print(pq.get())) K/ W" v4 r2 V! H* g
- print(pq.get()) v+ F5 K8 W" {+ K0 o. Z; |
- print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|