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. sort使用

    用sort对结构体进行排序步骤如下 1.先写c++头文件 # include<iostream># include<algorithm> //这个是sort的头文件 using ...

  2. python关于函数超时异常处理

    import time import func_timeout from func_timeout import func_set_timeout def time_sleep(): time.sle ...

  3. Lazarus 开发环境使用技巧

    Lazarus 开发环境使用技巧 1.代码补全 按下键盘的Ctrl+W键!输入变量后按下这个键就OK啦- 2.自动完成 自动完成的快捷键大多数都冲突了,解决方法是打开 工具(T)->选项...- ...

  4. NLog日志 富文本编辑器

    NLog日志 NLog是什么 NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们 ...

  5. OS-lab1

    OS-lab1 boot boot文件夹中只有start.S文件,这个文件用于初始化内核.关掉中断,设置内核栈,并跳转到main函数. init init.c 执行初始化操作. main.c 主函数, ...

  6. Linux 第十二节(samba NFS )

    samba     跨平台共享,基于smb协议. NFS yum install samba cd /etc/samba   //samba配置文件 mv smb.conf smb.conf_bak  ...

  7. 源码编译mariadb

    1.写一个一键安装 mariadb 数据库脚本. [root@centos8mini ~]#vim install_mariadb #!/bin/bash#安装包PACKAGE="maria ...

  8. 26_自定义Loader

    自定义Loader loader就是对模块的源代码进行处理(转换),如css-loader.style-loader等 在上一篇的源代码中我们已经知道了loader是在runLoaders才会去使用l ...

  9. temp_laijx_2023

    ############################ [{\"itemKey\": \"jenkinsConfig\",\"itemValue\& ...

  10. C#消息泵探索(二)

    ​ 引言: 上篇文章里简单的解释了C#的消息泵原理,这里我们以winform为例详细地了解一下实现代码. 底层实现 [DllImport(ExternDll.User32, ExactSpelling ...