|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解
1 V& z4 M# Y, e; n: gPython3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象& A- w" c @1 y" Y' i4 C6 A: ?
import queue
9 c8 k0 p s5 t& F0 h4 p& J3 yq = queue.queue(maxsize = 10)
" \2 _( e# R( ]$ o' y! o) I" Dqueue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中 U# D& j+ A4 M H* {: y/ A
q.put(10)
" B2 `$ ^- y' t调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
' k% P) {" r- j1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出
2 K7 n: O) _- a( Aq.get()8 ]0 N F3 b: Q- u. y" N
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:
4 H2 X, }0 g3 P. z, k1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)$ h: M3 g# u Y A0 t
2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)
; J5 i7 S: ~: Q$ ^, ~3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):
7 L% M2 K! J0 y. _# } q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False
& O8 c' b; w7 }; I$ k1 Jq.full() 如果队列满了,返回True,反之False
/ d9 q! X) S) z! W) Cq.full 与 maxsize 大小对应& b: L" T( F5 A' ^4 @
q.get([block[, timeout]]) 获取队列,timeout等待时间
3 u' f x! g4 |; T' mq.get_nowait() 相当q.get(False)! m5 H0 E( c/ P! V( _
非阻塞 q.put(item) 写入队列,timeout等待时间
" q! V4 o; e3 x* F8 Gq.put_nowait(item) 相当q.put(item, False)1 ]3 d r: K2 H, F' _) S
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
9 m8 _& h2 Q' }) p: A0 b5 A2 m& Jq.join() 实际上意味着等到队列为空,再执行别的操作
2 F$ k( y" s1 ~2 P5 v
代码实例 7810
: y. a+ r$ L1 |- J- import queue! C( \2 @+ a( s* ^7 z
- , `5 B8 V+ X$ \$ e
- # 以下三个队列都可以设置最大长度maxsize,默认是无限大 C, x* V7 _! `" A1 ?# C( d: a5 I
- print("-------------queue.Queue----------------")9 s8 G8 Q5 x% H' X3 m: X
- # 线程消息队列,FIFO(先进先出)
1 Y D+ H& f' a z: Q2 z0 U$ d, y - q = queue.Queue(): O i! \: N' o) V+ l+ q
- q.put("one")1 y# ?" Y; y6 Z5 [6 d
- q.put("two")
- |! k, n* q4 h - q.put("three")
+ A* f, D3 l6 m' n" A: _ - print(q.get())0 K1 u. y6 D* \8 T: H1 ~4 l
- print(q.get())6 F6 _, `% y; n( `) k0 r/ G4 B
- print(q.get())" d) ~! f2 A' ~8 z/ B5 T2 b! g
- try:
g/ l* C6 E3 y% w! j/ j+ u - # 队列中没有数据, 会阻塞。4 E; \4 s: f/ S# |
- # 阻塞时间到了还没有数据 抛出 queue.Empty 异常' h0 E4 ]2 Y0 }, n! A! |6 d) _
- print(q.get(timeout=3))
3 z2 j: s' ]2 n2 D1 R: o - except queue.Empty as q_e:
' u# q& z2 c, R- V - print('queue empty') `! E% ^) V; Z, c
- ( x7 ^" [: x8 i7 e% H- J5 a
- print("-------------queue.LifoQueue----------------")
# E* M- M* U% I( K - # 线程消息队列,LIFO(后进先出)
( F3 r2 Y$ F, Y/ X8 s - lq = queue.LifoQueue()
' }" O$ f! C$ r& x; H6 `7 W. e - lq.put("one"): R6 r0 l# }7 L
- lq.put("two")# s; A4 `8 }0 q' K
- lq.put("three")! F2 h0 H( e" {8 L
- print(lq.get()) [' e$ w3 C+ I+ W
- print(lq.get())- ]0 T7 u5 B" }2 H: k) y+ ]1 j4 G
- print(lq.get())
. @1 h6 Z* Q2 q1 W4 B+ ?; k+ F -
" _7 b3 O, L8 Z; i% F- ? - print("-------------queue.PriorityQueue----------------"); k* Q$ L9 L& ^ C, h5 Z5 S% o# N
- # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
$ \/ \: a2 q* A! Z m/ w2 q - pq = queue.PriorityQueue()' s% W4 ^1 M0 \7 X: N' C/ ^
- pq.put((1, "Jet"))
' u: t# w8 ^8 c, G) R# k6 H - pq.put((3, "Jack"))2 W4 ^# |9 r* J) |) p( H$ r
- pq.put((2, "Judy"))
/ x' I& H: b9 a- \8 b - print(pq.get())
; g* l" A, o- W) @; a - print(pq.get())
8 x D4 c: r9 u$ K" p; y# W- r7 ] - print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|