queue模块实现了多生产者,多消费者队列

queue模块的常用类和异常

queue.Queue(maxsize=0)
先进先出(FIFO)的队列,
maxsize: 队列的大小(即队列的元素个数),默认0,队列大小无限;如果超过maxsize,队列会加锁,添加新元素是被堵塞,直到队列中的元素小于maxsize queue.LifoQueue(maxsize=0)
后进先出(LIFO)的队列
maxsize参数同 queue.Queue 用法一样 queue.PriorityQueue(maxsize=0)
优先级队列,优先级小的元素先出,优先级通过 sorted(list(entries))[0] 的返回值决定
maxsize参数同 queue.Queue 用法一样 queue.SimpleQueue
无限FIFO队列 queue.Empty
异常
为空的queue对象调用 Queue.get() 方法引发该异常 queue.Full
异常
已满的queue对象调用 Queue.put() 方法引发该异常

队列对象方法

Queue,LifoQueue,PriorityQueue对象的方法一样,使用Queue类说明

Queue.qsize()
返回队列的元素个数 Queue.empty()
队列为空返回 True,否则返回 False Queue.full()
队列已满返回 True,否则返回 False Queue.put(item, block=True, timeout=None)
往队列里加入item,即生产元素,默认队列已满时会堵塞不引发异常
block: 队列已满时是否堵塞当前准备往队列里加入元素的线程,默认True
timeout: 线程被堵塞的时长,默认None
若队列已满且block=False,会引发 queue.FULL 异常
若队列已满且block=True,在timeout时间内,队列一直处于已满状态,引发 queue.FULL 异常 Queue.put_nowait(item)
相当于Queue.put(item, block=False),队列元素已满,直接引发queue.FULL异常 Queue.get(block=True, timeout=None)
删除并返回队列里的一个item,即消费元素,默认队列已空时会堵塞不引发异常
block: 队列已空时是否堵塞当前准备往队列里取出元素的线程,默认True
timeout: 线程被堵塞的时长,默认None,
若队列已空且block=False,会引发 queue.Empty 异常
若队列已空且block=True,在timeout时间内,队列一直处于空状态,引发 queue.Empty异常 Queue.get_nowait()
相当于Queue.get(block=False),队列元素为空,直接引发 queue.Empty 异常 Queue.task_done()
使用 Queue.get() 方法之后,调用该方法告诉队列当前任务已完成,队列里的item减少一个
通常配合 Queue.join() 方法使用 Queue.join()
堵塞当前线程,知道对垒中的所有任务完成
当队列的item数量为0,Queue.join() 方法取消堵塞

示例

import threading, queue
from concurrent.futures import ThreadPoolExecutor #账户类
class Account:
def __init__(self, account_no, balance):
#账户编号和账户余额
self.account_no = account_no
self.balance = balance def getBlance(self):
return self.balance #提取现金方法
def draw(self, queues):
draw_amount = queues.get()
if self.balance >= draw_amount:
print(threading.current_thread().name+'\t取钱成功!吐出钞票:'+str(draw_amount))
self.balance -= draw_amount
print(threading.current_thread().name+'操作之后\t余额为:'+str(self.balance))
else:
print(threading.current_thread().name+'\t取钱失败!余额不足!\t当前余额为:'+str(self.balance))
queues.task_done() #存钱方法
def deposit(self, queues):
deposit_amount = queues.get()
print(threading.current_thread().name+'\t存钱成功!存入钞票:'+str(deposit_amount))
self.balance += deposit_amount
print(threading.current_thread().name+'操作之后\t余额为:'+str(self.balance))
queues.task_done() queues = queue.Queue(10) for item in (2000, 1000, 1000, 900):
queues.put(item) acct = Account('986623', 0) with ThreadPoolExecutor(10, thread_name_prefix='Account_Thread_Pool') as pools:
pools.submit(acct.draw, queues)
pools.submit(acct.deposit, queues)
pools.submit(acct.deposit, queues)
pools.submit(acct.draw, queues)
queues.join()
print(threading.current_thread().name+'结束')
import queue, threading, time

#产生元素函数
def producer(que,num):
for i in range(num):
que.put(i)
print('已放入数据:'+str(i))
print(que.empty())
print(que.qsize())
time.sleep(1) #消费元素函数
def consumer(que):
while not que.empty():
print('已取出数据:'+str(que.get()))
time.sleep(1)
else:
print('队列已空,请加入元素再取出') q = queue.Queue(1)
threading.Thread(target=producer, args=(q,10), name='producer').start()
threading.Thread(target=consumer, args=(q,), name='consumer').start()

Python3之并发(七)---线程同步队列(queue)的更多相关文章

  1. Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  2. 孤荷凌寒自学python第四十三天python 的线程同步之Queue对象

     孤荷凌寒自学python第四十三天python的线程同步之Queue对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Queue对象是直接操作队列池的对象,队列中可以存放多种对象,当然也 ...

  3. Java多线程总结之线程安全队列Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...

  4. 【java】Java多线程总结之线程安全队列Queue【转载】

    原文地址:https://www.cnblogs.com/java-jun-world2099/articles/10165949.html ============================= ...

  5. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

  6. java并发:线程同步机制之Volatile关键字&原子操作Atomic

    volatile关键字 volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchro ...

  7. 33 - 并发编程-线程同步-Event-lock

    目录 1 线程同步 1.1 Event 1.1.1 什么是Flag? 1.1.2 Event原理 1.1.3 吃包子 1.2 Lock 1.2.1 lock方法 1.2.2 计数器 1.2.3 非阻塞 ...

  8. java并发:线程同步机制之ThreadLocal

    1.简述ThreadLocal ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程.ThreadLocal是一个线程级别的局部变量 ...

  9. java并发:线程同步机制之Lock

    一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...

  10. 【java并发】线程同步工具Semaphore的使用

    Semaphore通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,我们可以自己设定最大访问量.它有两个很常用的方法是acquire()和release(),分别是获得许可和释放许可.  官方J ...

随机推荐

  1. jar包下不下来

    1.maven中的settings.xml文件中的镜像资源配置 <mirror> <id>alimaven</id> <name>aliyun mave ...

  2. .NET Framework 中对webapi进行jwt验证

    最近在项目中对webapi进行了jwt验证,做一个记录 有关于jwt生成和验证token的操作全部记录在jwthelper.cs文件中: /// <summary> /// 授权JWT类 ...

  3. unity 阿拉伯数字转中文汉字

    直接调用即可 代码如下: using System; using System.Collections; using System.Collections.Generic; using System. ...

  4. 简单的关键词查找实验(基于C语言)

    准备 书名数据库的阵列表示 关键字 书籍 B1 B2 B3 B4 B5 B6 B7 algebra 1 1 1 1 1 1 0 application 1 0 1 1 1 1 0 elementary ...

  5. SSB调制与解调(Simulink&Matlab)

    题目:基于Simulink的SSB信号调制与解调仿真 参考文章 一.实验目的与要求 目的:学习SSB信号的调制与解调仿真 要求: 具有MATLAB的仿真结果并附上代码 具有基于Simulink的模块的 ...

  6. C# RSA加密解密 签名实现

    class RSACryptoItem { public RSACryptoServiceProvider Provider; public List<byte> PubKeyBytes; ...

  7. jupyter notebook 切换环境

    jupyter-notebook 中切换 conda 虚拟环境 介绍 ​ jupyter notebook是anaconda中root目录中默认的python环境,如果要使拥创建的其他环境,则需要安装 ...

  8. 解决 VSCode git commit 时 No such file or directory 报错问题

    在git 进行 commit 时出现了 Git: .git/hooks/pre-commit: line 2: ./node_modules/pre-commit/hook: No such file ...

  9. 【vcpkg】使用vcpkg安装库

    https://blog.csdn.net/cjmqas/article/details/79282847 使用vcpkg 查看vcpkg支持的开源库列表 执行命令 .\vcpkg.exe searc ...

  10. mysql 优化表空间报错Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again

    背景:mysql数据库中有几个表的碎片率太高,浪费了存储空间且降低了读写效率,需要整理. mysql版本:5.6 先用optimize table 试试. 也执行了很久.但是结束后,data_free ...