Python的condition和阻塞队列Queue

从生产者-消费者模型看Python线程安全容器的设计哲学 本文深入探讨了Python线程安全容器的设计哲学,以生产者-消费者模型为例,详细解析了Queue模块的工程智慧。通过对比传统同步原语的局限性,展示了Queue在多线程环境下处理共享变量的优势,并提供了电商秒杀、日志处理等实战案例,帮助开发者高效实现线程安全的数据通信。 阅读详情

Python的condition和阻塞队列Queue

条件(Condition)

条件同步机制是指:一个线程等待特定条件,而另一个线程发出特定条件满足的信号。 解释条件同步机制的一个很好的例子就是生产者/消费者(producer/consumer)模型。生产者随机的往列表中“生产”一个随机整数,而消费者从列表中“消费”整数。
实例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/25 9:40
# @File    : produ.py
import random
import threading

import time




#生产者
class Producer(threading.Thread):

    def __init__(self,integers,condition,name):

        """
        构造器
        @:param integers 整数列表
        @:param condition 条件同步对象
        @:param name 线程名字
        """
        threading.Thread.__init__(self)
        self.integers = integers
        self.condition = condition
        self.name = name



    def run(self):
        """
        向队列中随机添加数字
        :return:
        """
        while True:
            integer = random.randint(0,300)
            self.condition.acquire()     #获取锁
            print '锁被',self.name,'拿了'
            self.integers.append(integer)   #加入列表
            print integer,'被',self.name,'加入列表'
            print '锁 被',self.name,'唤醒'
            self.condition.notify()
            print '锁被',self.name,'释放'
            self.condition.release()
            time.sleep(1)


#消费者
class Consumer(threading.Thread):
    def __init__(self,integers,condition,name):
        threading.Thread.__init__(self)
        self.integers = integers
        self.condition = condition
        self.name = name



    def run(self):
        while True:
            self.condition.acquire()
            print '锁被',self.name,'拿了'
            while True:
                if self.integers:
                    integer = self.integers.pop()
                    print integer,'从列表中被',self.name,'移除'
                    break

            print self.name,'等待'
            self.condition.wait()
            print '锁被',self.name,'释放'
            self.condition.release()


def main():
    integers = []
    condition = threading.Condition()
    consumer =  Consumer(integers,condition,'消费者')
    producer = Producer(integers,condition,'生产者')
    producer.start()
    consumer.start()
    producer.join()
    consumer.join()
    if __name__ == '__main__':
        main()


main()

队列(Queue)

队列是一个非常好的线程同步机制,使用队列我们不用关心锁,队列会为我们处理锁的问题。 队列(Queue)有以下4个用户感兴趣的方法:
put: 向队列中添加一个项;
get: 从队列中删除并返回一个项;
task_done: 当某一项任务完成时调用;
join: 阻塞知道所有的项目都被处理完。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/25 10:10
# @File    : que.py

#生产者消费者,阻塞队列实现



import random
from  Queue import  Queue
import  threading
import time


class Producer(threading.Thread):
    """
    @:param queue 阻塞队列
    @:param name 线程名字
    """
    def __init__(self,queue,name):
        threading.Thread.__init__(self)
        self.queue = queue
        self.name = name


    def run(self):
        while True:
            integer = random.randint(0,350)
            self.queue.put(integer)
            print self.name,'将',integer,'加入队列'
            time.sleep(6)



class Consumer(threading.Thread):
    def __init__(self,queue,name):
        threading.Thread.__init__(self)
        self.queue = queue
        self.name = name


    def run(self):
        while True:
            integer = self.queue.get()
            print self.name,'将',integer,'从队列中移除'
            self.queue.task_done()


def main():
    queue = Queue(32)
    consumer = Consumer(queue,'消费者')
    producer = Producer(queue,'生产者')
    producer.start()
    consumer.start()

    if __name__ == '__main__':
        main()

main()
多目标进化算法——NSGA-II(python实现) NSGA-II(python实现)--最全注释,痴呆能懂-- 阅读详情

相关推荐

Linux系统安装AutoDockTools、AutoGrid和AutoDock并实现分子对接(详细讲解)

linux系统为centos7.0 按照下面操作安装AutoDockTools(MGLTools) 1. 下载安装包,链接(https://ccsb.scripps.edu/mgltools/downloads/),我的linux系统是64位,下载红色标记源代码,拷贝入linux目标文件夹下。 2. shell终端进行安装: 1. 终端进入安装包所在文件夹,并获取root权限;赋予代码安装权限; cd /home/... #目标文件夹,根据目标程序文件位置进行更改 su #获

carlos_zhao的博客 1万+

python 线程同步_Python中使用Queue和Condition进行线程同步的方法

Queue模块保持线程同步利用Queue对象先进先出的特性,将每个生产者的数据一次存入队列,而每个消费者将依次从队列中取出数据import threading # 导入threading模块import Queue # 导入Queue模块class Producer(threading.Thread):# 定义生产者类def __init__(self,threadname):th...

weixin_39732249的博客 203

Oracle迁移至华为GaussDB SQL语法和存储过程转换

在将Oracle数据库迁移至GaussDB时,SQL语法和存储过程的转换是确保应用程序正常运行和数据完整性的关键环节。由于两者在数据类型、函数、过程语言等方面存在差异,必须系统化地进行转换和测试。正则表达式脚本:批量替换常见的语法差异。SQL解析工具:解析SQL脚本,生成GaussDB兼容的语法。代码审查工具:自动检查转换后的代码,确保语法和逻辑正确。将Oracle迁移至GaussDB涉及到SQL语法和存储过程的全面转换。通过系统化的转换步骤、使用合适的工具并结合手动调整,可以确保迁移过程的顺利进行。

weixin_38428874的博客 2396

python queue get 方法_python多线程编程之Queue---put/get 方法的阻塞

python 中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。1. 阻塞模式导致数据污染importQueueq =Queue.Queue(10)foriinrange(10):myData = 'A'q.put(myData)myData = 'B'这是一段极其简单的代码,但我总是不能获得期望的结果(期望在队列中写...

weixin_39841709的博客 2118

Unity Shader实战:用Matcap给你的低模角色快速换上‘次世代’材质(附完整Shader代码)

本文详细介绍了Unity中Matcap技术的实战应用,通过Shader代码实现低模角色的次世代材质表现。Matcap技术利用预烘焙光照贴图,显著提升材质质感同时保持极低性能消耗,特别适合移动游戏和独立开发。文章包含完整Shader代码、平面模型着色优化方案及动态环境反射增强技巧,帮助开发者快速提升低模视觉效果。

weixin_28718755的博客 385

CentOS7无外网环境下MySQL8.0完整离线部署指南

本文详细介绍了在CentOS7无外网环境下,如何通过MySQL8.0二进制包进行完整离线部署。指南涵盖了从环境准备、依赖安装、用户与目录创建,到数据库初始化、服务配置及远程访问设置的全过程,并提供了关键的避坑技巧,帮助企业运维人员在内网环境中高效、稳定地搭建MySQL数据库服务。

xxx12的博客 1029

简析Python中的四种队列

队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 在Python文档中搜索队列(queue)会发现,Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque。 collections.deque deque是双端队列(double-ended q...

python学习者的博客 7462

YOLOv5改进之---EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

本文主要针对yolov5的iou损失函数进行改进,主要涵盖EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU这几种损失

qq_41920323的博客 1464

Python 队列(Queue)用法

一、队列(Queue) Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。 常用方法: Queue.qsize() 返回队列的大小 Queue.empty() 如果队列为空,返...

大魔王的博客 24万+

【libnice】meson + vs2022,生成win32工程

libnice

突围 947

YOLOv11训练命令完全指南:从核心参数解析到高级调优实战(数据配置、epochs设定、batch-size优化与img-size调整)(二)

本文介绍了YOLOv11训练命令的完整配置与解析,提供了基础训练命令示例及参数详解。示例命令包含数据集配置(coco.yaml)、训练轮次(300)、批次大小(64)、图像尺寸(640)等核心参数,以及优化器(AdamW)、学习率(0.001)等调优选项。通过代码实现展示了训练器的初始化流程,包括参数解析、设备设置、数据加载和模型创建等关键步骤,为YOLOv11模型训练提供了实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1093

python 线程间通信之Condition, Queue

Event 和 Condition 是threading模块原生提供的模块,原理简单,功能单一,它能发送 True 和 False 的指令,所以只能适用于某些简单的场景中。 而Queue则是比较高级的模块,它可能发送任何类型的消息,包括字符串、字典等。其内部实现其实也引用了Condition模块(譬如put和get函数的阻塞),正是其对Condition进行了功能扩展,所以功能更加丰富,更能满足...

weixin_33878457的博客 261

从零开始学习AI人工智能本体论:概念与实战

本文旨在为初学者提供一个全面而易于理解的人工智能本体论入门指南。我们将覆盖从基本概念到实际应用的全过程,帮助读者理解本体论在AI系统中的核心作用。核心概念与联系:介绍本体论的基本概念和原理核心算法与操作步骤:详细讲解本体构建和推理方法项目实战:通过实际案例展示本体论的应用实际应用场景:探讨本体论在不同领域的应用未来发展趋势:展望本体论在AI领域的前景本体论(Ontology): 在AI中,指对特定领域概念及其关系的明确形式化描述。

AI智能探索者的博客 865

python阻塞队列_键盘可中断的阻塞队列在Python中

It seemsimport QueueQueue.Queue().get(timeout=10)is keyboard interruptible (ctrl-c) whereasimport QueueQueue.Queue().get()is not. I could always create a loop;import Queueq = Queue()while True:try:q.g...

weixin_39610422的博客 107

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

python实现阻塞队列_利用C++如何实现一个阻塞队列详解

阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。考虑下,这样一个多线程模型,程序有一个主线程 master 和一些 worker 线程,master 线程负责接收到数据,给 worker 线程分配数据,wo...

weixin_42511769的博客 266

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python阻塞队列,键盘可中断的阻塞队列在Python中

It seemsimport QueueQueue.Queue().get(timeout=10)is keyboard interruptible (ctrl-c) whereasimport QueueQueue.Queue().get()is not. I could always create a loop;import Queueq = Queue()while True:try:q.g...

weixin_34547167的博客 220

Python3 模块精讲:queue —— 线程安全队列全解与实战

在 Python 多线程、多进程、异步编程高速发展的今天,queue 模块早已从一个简单的 “数据容器” 升级为支撑高并发、线程安全、任务调度的底层基石。无论是爬虫数据采集、后台任务队列、生产者 - 消费者模型,还是微服务消息中转、AI 模型推理任务排队,queue 都以安全、简洁、稳定的特性成为标准库中的 “隐形骨干”。

qq_28372005的博客 553

自己实现阻塞队列

照着ArrayBlockingQueue自己实现了一些阻塞队列,其原理就是生产者消费者关系,先实现了功能,一些细节(为什么不用wite,notify 为什么不用lock.lock())暂时没有去学习。队列代码:import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /*

Mr梵高先生的个人博客 723

Python中的线程间通信

Python中的线程间通信 文章目录Python中的线程间通信1.Queue2.同步机制1.Event2.Semaphore(信号量)3.Lock(锁)4.RLock(可重入锁)5.Condition(条件变量) 1.Queue 使用线程队列有一个要注意的问题是,向队列中添加数据项时并不会复制此数据项,线程间通信实际上是在线程间传递对象引用。如果你担心对象的共享状态,那你最好只传递不可修改的数据结构(如:整型、字符串或者元组)或者一个对象的深拷贝。 Queue 对象提供一些在当前上下文很有用的附加特性。

wolfGuiDao的博客 1110

python多线程同步机制_Python多线程——线程间通信与同步机制

线程间通信1.Queue使用线程队列有一个要注意的问题是,向队列中添加数据项时并不会复制此数据项,线程间通信实际上是在线程间传递对象引用。如果你担心对象的共享状态,那你最好只传递不可修改的数据结构(如:整型、字符串或者元组)或者一个对象的深拷贝。Queue 对象提供一些在当前上下文很有用的附加特性。比如在创建 Queue 对象时提供可选的 size 参数来限制可以添加到队列中的元素数量。对于“生产...

weixin_39817012的博客 169

python线程间通信的几种方法_Python如何实现线程间通信

问题你的程序中有多个线程,你需要在这些线程之间安全地交换信息或数据解决方案从一个线程向另一个线程发送数据最安全的方式可能就是使用 queue 库中的队列了。创建一个被多个线程共享的 Queue 对象,这些线程通过使用 put() 和 get() 操作来向队列中添加或者删除元素。 例如:Queue 对象已经包含了必要的锁,所以你可以通过它在多个线程间多安全地共享数据。 当使用队列时,协调生产者和消费...

weixin_39959349的博客 697

python concurrent queue_使用Concurrent集合

我们在前面已经通过ReentrantLock和Condition实现了一个BlockingQueue:public class TaskQueue {private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();private Queue queue = n...

weixin_32211137的博客 208

详解GBDT梯度提升树原理,看完再也不怕面试了

在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我们需要感知线程之间的状态,交换线程之间的信息是一件非常复杂和困难的事情。因为我们没有更高级的系统权限,也没有上帝视角,很难知道目前运行的状态的全貌,所以想要设计出一个稳健运行没有bug的功能,不仅非常困难,而且调试起来非常麻烦。 生产消费者模式 在日常开发当中,从一个线程向另外的线程传输数据又是一件家常便饭的事情。举个最简单的例子,我们在处理网页请求的时候,需要打印下来这一次请求的相关日志。打印日志是一次IO行为,这是非常消耗时间的,所

august5291的博客 241

Python快速而美丽[v1.0.0][线程通信详解]

线程调度由操作系统完成,存在一定的随机性无法准确的控制线程的轮换执行,通过线程通信可以达到该效果

一块大洋 2766

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

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 注:什么叫线程安全?这个首先要明确。线程安全的类 ,指的是类内共享的全局变量的

xwnxwn的专栏 719

Python多线程——线程间通信与同步机制

线程间通信 1.Queue 使用线程队列有一个要注意的问题是,向队列中添加数据项时并不会复制此数据项,线程间通信实际上是在线程间传递对象引用。如果你担心对象的共享状态,那你最好只传递不可修改的数据结构(如:整型、字符串或者元组)或者一个对象的深拷贝。 Queue 对象提供一些在当前上下文很有用的附加特性。比如在创建 Queue 对象时提供可选的 size 参数来限制可以添加到队列中的元素数量。对于...

weixin_30480583的博客 284

设计python培训学习之堵塞队列

python学习之堵塞队列 isNone 1632798921 python开发网络爬虫,爬取的数据资料需要转储到本地存储介质或者数据库中,如果数据量过大,为避免爆内存,就必须分批读取,分批写入;而不论是从网络读取还是向本地写入,都有大量耗时的IO操作,就要用到阻塞队列,并且要采用多线程技术,使读取和写入异步并行执行,来最大限度地提高程序性能。下面介绍利用线程技术实现的带二级缓存的阻塞队列的设计。 import queue # 使用队列作为二级缓存import threadingimport tim

weixin_63757190的博客 356
上一篇: Python多线程
下一篇: Python3操作MySql数据库
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值