博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的condition和阻塞队列Queue
阅读量:2442 次
发布时间:2019-05-10

本文共 3290 字,大约阅读时间需要 10 分钟。

Python的condition和阻塞队列Queue

条件(Condition)

条件同步机制是指:一个线程等待特定条件,而另一个线程发出特定条件满足的信号。 解释条件同步机制的一个很好的例子就是生产者/消费者(producer/consumer)模型。生产者随机的往列表中“生产”一个随机整数,而消费者从列表中“消费”整数。

实例:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2017/7/25 9:40# @File    : produ.pyimport randomimport threadingimport 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 randomfrom  Queue import  Queueimport  threadingimport timeclass 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()

转载地址:http://utcqb.baihongyu.com/

你可能感兴趣的文章
typeof运算符_JavaScript typeof运算子
查看>>
react 前端拆分_React中的代码拆分
查看>>
jsonp_JSONP指南
查看>>
如何禁用ESLint规则
查看>>
如何在macOS上安装PostgreSQL
查看>>
mysql用户权限_MySQL用户权限
查看>>
JavaScript切换条件
查看>>
在邮件标头中找到无效的字符_在Express中使用HTTP标头
查看>>
express 邮件发送_使用Express发送回复
查看>>
react生命周期_React生命周期事件
查看>>
叶节点到根节点的路径_节点路径模块
查看>>
前端测试简介
查看>>
如何查找公共子字符串长度_如何在C中查找字符串的长度
查看>>
javascript运算符_JavaScript比较运算符
查看>>
字符串tostring_字符串toString()方法
查看>>
字符串方法中会修改原字符串_字符串padStart()方法
查看>>
字符串endsWith()方法
查看>>
number.isnan_Number isNaN()方法
查看>>
虚拟dom_虚拟DOM
查看>>
安卓录制视频不录制外界声音_我如何录制我的视频
查看>>