python中的queue模块,python中的queue,Python Queue模块详解

python中的queue模块,python中的queue,Python Queue模块详解

本文主要介绍Python队列模块的详细讲解,有需要的朋友可以参考一下。

在Python中,队列是线程间最常用的数据交换形式。队列模块是提供队列操作的模块。虽然简单易用,但是如果不小心,还是会发生一些意外。

创建一个“队列”对象

导入队列

q=队列。队列(maxsize=10)

排队。队列类是队列的同步实现。队列长度可以是无限的,也可以是有限的。队列长度可以通过Queue构造函数的可选参数maxsize来设置。如果maxsize小于1,则队列长度是无限的。

将一个值放入队列中

q.put(10)

调用queue对象的put()方法在队列末尾插入一个项目。Put()有两个参数,第一项是必需的,是插入项的值;第二个块是可选参数,默认为

1。如果队列当前为空,块为1,put()方法会使调用线程暂停,直到数据单元为空。如果block为0,put方法将抛出一个完整的异常。

将一个值从队列中取出

q.get()

调用queue对象的get()方法从队列头删除和返回一个项目。可选参数为block,默认值为True。如果队列为空,block为True,get()会使调用线程暂停,直到有一个项目可用。如果队列为空并且block为False,那么队列将抛出一个空异常。

Python Queue模块有三种队列及构造函数:

1.Python队列模块的FIFO队列是FIFO。班级队列。队列(最大大小)

2.LIFO类似于堆,即先进后出。班级队列。LifoQueue(maxsize)

3.另一个是优先级队列级别越低,它越先出来。班级队列。优先级队列(maxsize)

此包中的常用方法(q = Queue.Queue()):

Q.qsize()返回队列的大小。

如果队列为空,Q.empty()返回True,否则返回False。

如果队列已满,Q.full()返回True,否则返回False。

Q.full对应于maxsize的大小

Q.get([block[,timeout]])获取队列,超时等待时间

Q.get_nowait()等价于q.get(False)

非q.put(项目)写入队列被阻止,等待时间超时

Q.put_nowait(item)等价于q.put(item,False)

Q.task_done()在一个任务完成后,q.task_done()函数向任务已经完成的队列发送一个信号。

Q.join()实际上意味着在执行其他操作之前一直等到队列为空。

范例:

认识到一个线程不断地生成一个随机数到一个队列中(考虑使用模块队列)

实现一个线程从上述队列中连续取奇数。

意识到另一个线程一直从上面的队列中取出偶数。

#!/usr/bin/env python

#编码:utf8

导入随机,线程,时间

从队列导入队列

#生产者线程

类生产者(线程。线程):

def __init__(self,t_name,queue):

threading.Thread.__init__(self,name=t_name)

self.data=队列

定义运行(自身):

对于范围(10)中的I:# 10个数字是随机生成的,可以修改为任意大小。

randomnum=random.randint(1,99)

打印“%s: %s”正在向队列中生成%d!”% (time.ctime(),self.getName(),randomnum)

Self.data.put(randomnum) #将数据依次放入队列中。

时间.睡眠(1)

打印“%s: %s已完成!”%(time.ctime(),self.getName())

#消费者线程

类Consumer_even(线程。线程):

def __init__(self,t_name,queue):

threading.Thread.__init__(self,name=t_name)

self.data=队列

定义运行(自身):

而1:

尝试:

Val _ even=self.data.get (1,5) # get (self,block=true,timeout=none),1表示阻塞等待,5表示超时5秒。

如果val_even%2==0:

打印“%s: %s”正在消耗。'队列中的%d已被消耗!'% (time.ctime(),self.getName(),val_even)

时间.睡眠(2)

否则:

self.data.put(val_even)

时间.睡眠(2)

例外:#等待输入,超过5秒后报错。

打印“%s: %s已完成!”%(time.ctime(),self.getName())

破裂

类Consumer_odd(线程。线程):

def __init__(self,t_name,queue):

threading.Thread.__init__(self,name=t_name)

self.data=队列

定义运行(自身):

而1:

尝试:

val_odd=self.data.get(1,5)

if val_odd%2!=0:

打印“%s: %s”正在消耗。'队列中的%d已被消耗!'% (time.ctime(),self.getName(),val_odd)

时间.睡眠(2)

否则:

self.data.put(val_odd)

时间。睡眠(2)

除了:

打印" %s: %s已完成!"% (time.ctime(),self.getName())

破裂

#主线程

def main():

queue=Queue()

制作人=制作人(' Pro .'队列)

消费者事件=消费者事件('欺诈事件'队列)

Consumer _ odd=Consumer _ odd(' Con _ odd .队列)

producer.start()

消费者_even.start()

consumer_odd.start()

producer.join()

consumer_even.join()

consumer_odd.join()

打印"所有线程终止!"

if __name__=='__main__ ':

主()

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: