|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解
: c5 K5 d0 H1 v0 \- t/ ^Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象* Y% w- z7 L/ N; S: s, i- W6 f- K
import queue2 M! }) I& Q& S3 l( j3 w3 x
q = queue.queue(maxsize = 10)
. m* [8 ?8 `. U& pqueue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中" M2 r r1 F, c& s; @ R( l2 j0 W
q.put(10)9 U p2 `$ ^( W! b+ w
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为4 u, i" b! ]. J: E
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出
: b: y3 N; F2 l* _$ _q.get()& D% Z/ u5 M; W1 p& D
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:5 G5 A. j& `' x2 k
1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize); f+ u6 Z7 y6 W2 _
2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)
! r$ e6 i- E" r2 K: E3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):
5 v' V: s6 B @; M& H# | q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False
% C) h3 I( x1 R1 L1 [+ ~0 f$ Wq.full() 如果队列满了,返回True,反之False. ?! ~: X0 u( \' e4 D# ]. V
q.full 与 maxsize 大小对应" U- F3 V7 `2 X" s% \% w+ z
q.get([block[, timeout]]) 获取队列,timeout等待时间
( V6 ^1 x0 S! ?, d: l( ~q.get_nowait() 相当q.get(False)# A! l5 E$ K% K$ y$ X
非阻塞 q.put(item) 写入队列,timeout等待时间6 O& |; X! p! C; h: ^; l
q.put_nowait(item) 相当q.put(item, False)
6 J2 g& i. B% L- Z# S! K4 R' v6 S# _q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
, S, v, i* A/ e" L+ mq.join() 实际上意味着等到队列为空,再执行别的操作
2 X% Y. [* h K) p9 E% X代码实例 7810' V) w, }0 f& {) T6 m
- import queue
3 H2 ?2 J) A7 ^5 a r -
* m8 j& t, w4 h" w6 g - # 以下三个队列都可以设置最大长度maxsize,默认是无限大
5 f1 a* i2 f2 u" m0 |4 D2 J8 T6 M - print("-------------queue.Queue----------------")
/ l' L, w6 h8 W. K - # 线程消息队列,FIFO(先进先出)0 H P$ g1 J3 o; T1 L6 ~# q( `% U6 R& C
- q = queue.Queue()
/ v$ B# N1 X0 }2 C - q.put("one"): J) Z2 w! Y( y8 c( |7 v; _0 _& c
- q.put("two")
m& ~6 t' r: E$ G+ z - q.put("three")
3 a D+ A; i9 q3 ^" `' R* Z2 A+ R - print(q.get())$ I) a( ^/ r, H, _6 N- N9 l
- print(q.get()) x. i2 O0 k- I# ?
- print(q.get())
7 C+ O7 i* }9 v/ E g" z+ | - try:1 x9 m& f- v' D# K+ C( V( h
- # 队列中没有数据, 会阻塞。7 d$ g/ |2 I3 @0 U. r
- # 阻塞时间到了还没有数据 抛出 queue.Empty 异常
$ e* _- n7 {3 S* p9 B - print(q.get(timeout=3))
& A L" A# q, N0 ]; {0 \/ D - except queue.Empty as q_e:- u6 J4 s" W. D! _; \
- print('queue empty')' _5 ?( d: }# j1 ?! N
- : R: J3 e) Y$ A8 B$ d& }
- print("-------------queue.LifoQueue----------------")
) |0 V6 V3 U! n' E( E. _ - # 线程消息队列,LIFO(后进先出)' o. e0 S" A8 V& c# l
- lq = queue.LifoQueue()9 M# ~7 u8 S7 K' J( [
- lq.put("one")
' {, W" X8 a* c7 C `4 g - lq.put("two")
* G* y1 v7 c: n* F - lq.put("three")
$ Y; i( I$ N% W7 Z" D. u - print(lq.get())
`/ g6 ?6 D7 P - print(lq.get())- m! p; N) H) o" [9 Q
- print(lq.get())
$ D/ [) @5 I. w8 Y - ! u, \( V$ n0 m. [
- print("-------------queue.PriorityQueue----------------") g, w8 {" E$ T b" [9 m
- # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
4 m4 q. X, ]' J( d - pq = queue.PriorityQueue()
, i* N2 U0 O7 B% o - pq.put((1, "Jet"))4 g) W3 C/ A% y* v! P
- pq.put((3, "Jack"))
5 `* U7 d0 ~1 H+ y/ b - pq.put((2, "Judy"))
% |4 A" i3 Z; Y - print(pq.get())
: x0 `' ?1 ~, K2 S: D8 S - print(pq.get())
[7 N# e! g8 X- V3 Z/ ~ - print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|