python3协程 queue_Python:线程、进程与协程(3)——Queue模块及源码分析

Queue

模块是提供队列操作的模块,

队列是线程间最常用的交换数据的形式。

该模块提供了

三种队列:

Queue.Queue(maxsize):

先进先出,

maxsize

是队列的大小,

其值为非正数时为无线循环队列

Queue.LifoQueue(maxsize)

:后进先出,相当于栈

Queue.PriorityQueue(maxsize):

优先级队列。

其中

LifoQueue

PriorityQueue

Queue

的子类。三者拥有以下共同的方法:

qsize():

返回近似的队列大小。

为什么要加“近似”二字呢?因为当该值大于

0

的时候并不保证

并发执行的时候

get()

方法不被阻塞,同样,对于

put()

方法有效。

empty():

返回布尔值,队列为空时,返回

True

,反之返回

False

full()

:当设定了队列大小的时候,如果队列满了,则返回

True

,否则返回

False

put(item[,block[,timeout]]):

向队列里添加元素

item,block

设置为

False

的时候,

如果队列满了

则抛出

Full

异常。如果

block

设置为

True

timeout

设置为

None

时,则会一种等到有空位

的时候再添加进队列;否则会根据

timeout

设定的超时值抛出

Full

异常。

put_nowwait(item):

等价与

put(item,False)

block

设置为

False

的时候,如果队列为空,则抛

Empty

异常。如果

block

设置为

True

timeout

设置为

None

时,则会一种等到有空位的

时候再添加进队列;否则会根据

timeout

设定的超时值抛出

Empty

异常。

get([block[,timeout]]):

从队列中删除元素并返回该元素的值,

如果

timeout

是一个正数,

它会

阻塞最多超时秒数,并且如果在该时间内没有可用的项目,则引发

Empty

异常。

get_nowwait()

:等价于

get(False)

task_done()

:发送信号表明入列任务已完成,经常在消费者线程中用到。

join():

阻塞直至队列所有元素处理完毕,然后再处理其它操作。

(一)源码分析

Queue

模块用起来很简单很简单,但我觉得有必要把该模块的相关源代码贴出来分析

下,会学到不少东西,看看大神们写的代码多么美观,多么结构化模块化,

再想想自己写的

代码,都是泪呀,来学习学习。为了缩减篇幅,源码的注释部分被删减掉。

from time import time as _time

try:

import threading as _threading

except ImportError:

import dummy_threading as _threading

from collections import deque

import heapq

__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue']

class Empty(Exception):

"Exception raised by Queue.get(block=0)/get_nowait()."

pass

class Full(Exception):

"Exception raised by Queue.put(block=0)/put_nowait()."

pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值