|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
Python Queue 模块详解2 k1 b. e9 J' {+ h A" C( L
Python3中队列是线程间最常用的交换数据的形式。Queue模块python3内置的标准模块,是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象
/ x" F; g+ [7 R9 ?import queue$ i9 `7 Z0 m& E5 B9 T% w- f1 R
q = queue.queue(maxsize = 10)* u& K# _5 Y+ n# N$ k
queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中
% o) u1 K( `" Xq.put(10)1 U* i/ G1 g L2 w; m0 ]1 p6 M( C
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
- |& B5 e3 T% W1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出9 O3 r& R* Z, w$ B( g# `8 w
q.get()
7 j/ ~! k2 F( Y( {3 Y- E6 Y. `% e: N调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数:: ?2 V$ ?8 e! v; s; |, C
1、Python queue模块的FIFO队列先进先出。 class queue.queue(maxsize)0 ^& q! J" T2 {( i; ]
2、LIFO类似于堆,即先进后出。 class queue.Lifoqueue(maxsize)
1 U2 k u$ r2 j7 @5 {9 i, `) Z3、还有一种是优先级队列级别越低越先出来。 class queue.Priorityqueue(maxsize) 此包中的常用方法(q =queue.queue()):
- C3 X* m6 k w+ D. e. O) A; H2 t q.qsize() 返回队列的大小,即输出队列中元素的个数 q.queue.queue(5) 建立一个长度为5的队列q q.put(5) 将数字5入队 q.empty() 如果队列为空,返回True,反之False
1 E5 S8 \$ H# U3 U% g6 t5 E$ Y! Zq.full() 如果队列满了,返回True,反之False: I6 t3 F$ R( Y+ B7 i* A B
q.full 与 maxsize 大小对应
5 u! u' v* p1 @: lq.get([block[, timeout]]) 获取队列,timeout等待时间
5 [1 o; `4 D6 y, g: ]) pq.get_nowait() 相当q.get(False)3 p; E1 j( Y8 q. B/ O2 J
非阻塞 q.put(item) 写入队列,timeout等待时间
1 S1 A9 ], }: Z* z: S" Vq.put_nowait(item) 相当q.put(item, False) H% h2 G/ ?, S, @# U9 y
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
" {/ a9 s' M2 r5 p* I6 o; Aq.join() 实际上意味着等到队列为空,再执行别的操作
5 g6 | b/ F4 Z" `! t$ k
代码实例 7810
9 u/ D/ Z% p N7 U3 u2 Z' [- import queue
& g7 L" W# g# `1 y8 h1 w -
" q4 Q# C5 }3 f$ g u - # 以下三个队列都可以设置最大长度maxsize,默认是无限大1 J, d; }1 x( v4 |1 p
- print("-------------queue.Queue----------------")
; O5 t8 r0 x; e. i' j( U. K - # 线程消息队列,FIFO(先进先出)
) B8 e, g. a5 n- n& n3 ~4 X( c! U - q = queue.Queue()
% ^% b& ^6 {& b, [2 @ - q.put("one")6 ?7 l* W; Y, K* Z
- q.put("two")
2 r! k8 X9 T: a B9 W% Y: p Q) K - q.put("three")# i% c& ^4 ]9 {) {% ~
- print(q.get())+ m2 b4 U' b9 G- z
- print(q.get())
; c; `, w9 A I! t - print(q.get())1 Z2 ?. l+ n& |7 R
- try:2 y: D. j* M' j7 a; i+ r& U
- # 队列中没有数据, 会阻塞。
# Q& _% O% c" F - # 阻塞时间到了还没有数据 抛出 queue.Empty 异常7 Y9 @* M9 o# F" G
- print(q.get(timeout=3))
1 H6 P. y. a5 _. x7 \3 k - except queue.Empty as q_e:& ]+ z7 e' y8 I- P, p8 O y+ |. b
- print('queue empty')
5 q% ]$ p+ v6 b4 F4 |' B4 [, h) j4 H6 M2 W - & X6 g8 |% m3 T* [0 u
- print("-------------queue.LifoQueue----------------")/ {& g+ j) s( T9 u/ [- \1 [
- # 线程消息队列,LIFO(后进先出)2 N U# M! D+ U/ `) d( N; C
- lq = queue.LifoQueue()
( P1 Q9 d) q' _& M - lq.put("one")
' Y; J/ R1 q, p6 ~ - lq.put("two")
! F/ i2 c1 n( C1 h* x# l/ Q - lq.put("three")3 C6 h0 ?, ~) g7 b/ I
- print(lq.get())$ c; u7 k3 m. a: R
- print(lq.get())# ]0 x5 q6 ]3 {1 U% H t
- print(lq.get())
P& l* c( W# _ X& w -
( j% \2 O* N! s - print("-------------queue.PriorityQueue----------------")( B& J6 ~4 r$ L0 V- I, A5 Y& [
- # 线程消息队列,PriorityQueue(优先级的队列:数字越小优先级越高)
7 J Q' M, X9 j% l5 m - pq = queue.PriorityQueue()
" I) Z/ \; q# ^+ q& t: _ - pq.put((1, "Jet"))3 i$ O4 `: t* _5 Q
- pq.put((3, "Jack"))
5 a( q. ^& F5 J9 ]6 s2 d* D - pq.put((2, "Judy"))
6 M6 s/ W4 n: C# v3 V - print(pq.get())
. }( y% H+ a' E/ s: C# S - print(pq.get())/ C9 F6 r$ A1 T, g$ p
- print(pq.get())
复制代码 |
-
-
7810.py
1002 Bytes, 下载次数: 36, 下载积分: 财富 -1 点
|