queue模块基本使用

简介

在queue模块中实现了多生产者多消费者队列,当必须在多个线程之间安全的交换信息时,它是非常有用的,此模块中的Queue类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;
这个模块提供了三种类型的队列:

  • FIFO队列:先进先出
  • LIFO队列:后进先出
  • 优先级队列

Queue对象

class queue.Queue(maxsize = 0 )
FIFO队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。

常用方法描述
Queue.qsize()返回队列的大小
Queue.empty()判断队列是否为空,如果队列为空返回True
Queue.full()判断队列是否为满的,如果满了返回True
Queue.put(item, block=True, timeout=None)将数据放入队列中
Queue.get(block = True,timeout = None )从队列中取出数据
Queue.join()阻塞直到队列中的所有项目都已获取并处理完毕

示例代码

生产者-消费者问题的实现使用了Queue对象,以及随机生产(消费)的商品的数量,生产者和消费者独立并且并发的执行线程

参考《Python核心编程》多线程章节例程有改动。

import queue
from random import randint
import threading
import time

def writeQ(queue):
    print('prodecing  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):
    for  i in range(5):
        writeQ(queue)
        time.sleep(randint(1,3))

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

def main():
    q = queue.Queue(32)
    threads = []

    for i in range(0,3):
        t = threading.Thread(target = writer,args = (q,))
        threads.append(t)

    for i in range(0,3):
        t = threading.Thread(target = reader,args = (q,) )
        threads.append(t)

    for i in range(len(threads)):
        threads[i].start()

    for i in range(len(threads)):
        threads[i].join()

    print('all done ')

if __name__ == '__main__':
    main()

参考链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值