python消息队列模块_day43-python消息队列二-queue模块

Python提供了Queue模块来专门实现消息队列Queue对象

Queue对象实现一个fifo队列(其他的还有lifo、priority队列,这里不再介绍)。queue只有maxsize一个构造参数,用来指定队列容量,指定为0的时候代表容量无限。主要有以下成员函数:

Queue.qsize():返回消息队列的当前空间。返回的值不一定可靠。

Queue.empty():判断消息队列是否为空,返回True或False。同样不可靠。

Queue.full():类似上边,判断消息队列是否满

Queue.put(item, block=True, timeout=None):往消息队列中存放消息。block可以控制是否阻塞,timeout指定阻塞时候的等待时间。如果不阻塞或者超时,会引起一个full exception。

Queue.put_nowait(item):相当于put(item, False).

Queue.get(block=True, timeout=None):获取一个消息,其他同put。

以下两个函数用来判断消息对应的任务是否完成。

Queue.task_done():接受消息的线程通过调用这个函数来说明消息对应的任务已完成。

Queue.join(): 实际上意味着等到队列为空,再执行别的操作

例子:

#!/usr/bin/env python#-*- coding:utf-8 -*-#@time: 2017/12/18 19:31#Author: caicai#@File: demon3.py

'''写一个消费者和生产者,为了练习多线程,用多线程的方式实现,并通过类的重写的方法来实现'''

from Queue importQueuefrom threading importThreadimporttime#生成类,输出一堆数字

classProceduer(Thread):def __init__(self,queue):

super(Proceduer, self).__init__()

self.queue=queuedefrun(self):try:for i in xrange(1,10):print("put data is: {0} to queue".format(i))

self.queue.put(i)exceptException as e:print("put data error!")raisee#消费者类

classConsumer_odd(Thread):def __init__(self,queue):

super(Consumer_odd, self).__init__()

self.queue=queuedefrun(self):try:while notself.queue.empty():

number=self.queue.get()if number % 2 !=0:print("get {0} from queue ODD".format(number))else:

self.queue.put(number)

time.sleep(1)exceptException as e:raiseeclassConsumer_even(Thread):def __init__(self,queue):

super(Consumer_even, self).__init__()

self.queue=queuedefrun(self):try:while not self.queue.empty(): #queue.empty()

number =self.queue.get()if number % 2 ==0:print("get {0} from queue EVEN,thread name is: {1}".format(number, self.getName()))else:

self.queue.put(number)

time.sleep(1)exceptException as e:raiseedefmain():

queue=Queue()

p= Proceduer(queue=queue)

p.start()

p.join()

time.sleep(1)

c1= Consumer_odd(queue=queue)

c2= Consumer_even(queue=queue)

c1.start()

c2.start()

c1.join()

c2.join()print("All threads terminate!")if __name__ == '__main__':

main()

输出结果:

put datais: 1to queue

put datais: 2to queue

put datais: 3to queue

put datais: 4to queue

put datais: 5to queue

put datais: 6to queue

put datais: 7to queue

put datais: 8to queue

put datais: 9to queue

get1 fromqueue ODD

get2 from queue EVEN,thread name is: Thread-3get5 fromqueue ODD

get6 from queue EVEN,thread name is: Thread-3get7 fromqueue ODD

get8 from queue EVEN,thread name is: Thread-3get9 fromqueue ODD

get4 from queue EVEN,thread name is: Thread-3get 3 fromqueue ODD

All threads terminate!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值