Python多线程编程之queue模块

queue简介

我们使用queue模块,是用来提供线程间通信的机制,从而让线程之间可以互相分项数据。具体而言,就是创建一个队列,让生产者(线程)在其中放入新的商品,而消费者(线程)消费这些商品。

queue模块常用属性

queue 模块的类:

Queue(maxsize=0): 创建一个先进先出队列,给定最大值,没有空间时阻塞;否则为无限队列
LifoQueue(maxsize=0):创建一个栈,给定最大值,没有空间时阻塞,否则为无限队列
PriorityQueue(maxsize=0): 创建一个优先级队列。

queue异常

Empty : 当对空队列调用get*()方法时抛出异常
Full : 当对已满的队列调用put*()方法时抛出异常

queue对象方法

qsize() :返回队列大小
empty() :确认队列是否为空
full() :确认队列是否为满
put(item,block=True,timeout=None) :将item放如队列
put_nowait(item) :和put(item, False)相同
get(block=True,timeout=None) :从队列中取得元素
 get_nowait() :和get(False)相同
 task_done() :用于表示队列中的某个元素已执行完成
 join() :在队列中所有元素执行完毕并调用上面的task_done()型号之前,保持阻塞

生产者-消费者问题

接下来的实例,是有关生产者-消费者,使用Queue对象,以及随机生产(消费)的商品数量。生产者和消费者独立且并发执行线程。

prodcons.py

from random import randint
from time import sleep
from queue import Queue
from MyThread import MyThread

def writeQ(queue):
    print('producing object for Q...')  
    queue.put('xxx', 1)
    print('size now', queue.qsize())

def readQ(queue):
    val = queue.get(1)
    print('consumed object from Q... size now', \
        queue.qsize())

def writer(queue, loops):
    for i in range(loops):
        writeQ(queue)
        sleep(randint(1,3))

def reader(queue, loops):
    for i in range(loops):
        readQ(queue)
        sleep(randint(2,5))

funcs = [writer, reader]
nfuncs = range(len(funcs))

def main():
    nloops = randint(2,5)
    q = Queue(32)

    threads = []
    for i in nfuncs:
        t = MyThread(funcs[i],(q, nloops),
            funcs[i].__name__)
        threads.append(t)

    for i in nfuncs:
        threads[i].start()

    for i in nfuncs:
        threads[i].join()

    print('all done')

if __name__ == "__main__":
    main() 

执行结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值