`

Python学习(三):生产者-消费者

阅读更多

为了学习Python,最好还是直接从写代码入手,解决的问题如下:

1、设计三个线程,线程1每秒钟对一个值进行+1操作,线程2每秒钟对该值进行+3操作,线程3每秒钟对该值进行-2操作

涉及知识点:线程,锁,time标准库

代码如下:

#coding=utf-8
'''
Created on 2015年8月19日

设计三个线程,线程1每秒钟对一个值进行+1操作,线程2每秒钟对该值进行+3操作,线程3每秒钟对该值进行-2操作

@author: minmin
'''
import time
import thread

def loop(name, value, nsleep, action, lock1, lock2):
    
    while True:
        lock1.acquire()
        value[0] += action
        action_str = ""
        if action >= 0:
            action_str = "+" + str(action)
        else:
            action_str = str(action) 
        
        print name + "对value做了" + action_str + "操作, value = " + str(value[0])
        lock1.release()
        time.sleep(nsleep)

    lock2.release()

def main():

    lock = thread.allocate_lock()
    lock1 = thread.allocate_lock()
    lock2 = thread.allocate_lock()
    lock3 = thread.allocate_lock()
    
    value = [10]
    
    lock1.acquire()
    lock2.acquire()
    lock3.acquire()
    
    locks = [lock1, lock2, lock3]
    
    thread.start_new_thread(loop, ("Producer1", value, 1, 1, lock, lock1))
    thread.start_new_thread(loop, ("Producer2", value, 1, 3, lock, lock2))
    thread.start_new_thread(loop, ("Customer1", value, 1, -2, lock, lock3))    

    #防止主线程执行完自动关闭运行的三个线程
    for i in locks:
        while i.locked(): pass

if __name__ == '__main__':
    main()

 

运行结果如下图:



 

2、设计三个线程,两个生产者一个消费者:一个生产者每秒钟生产1一个产品放入产品池,一个生产者每秒钟生产2个产品放入产品池,一个消费者每秒钟从产品池中消费1-5之间的一个随机数个产品。产品池满时,生产者等待,产品池有空位时,生产者继续生产;产品池空时,消费者等待,产品池有产品时,消费者继续消费。每个产品有自己独特的标记。

涉及知识点:多线程、锁、threading、生产者-消费者、阻塞队列。

这里先实现一个线程的子模块myThread,方便调用函数。

代码如下:

 

#coding=utf-8
'''
Created on 2015年8月23日

@author: minmin
'''
import threading
import time

class MyThread(threading.Thread):


    def __init__(self, func, args, name = ''):
        threading.Thread.__init__(self)
        self.func = func
        self.args = args
        self.name = name
        
    def getResult(self):
        return self.res
    
    def run(self):
        print 'starting %s at:%s' % (self.name, time.strftime('%Y-%m-%d %H:%M:%S'))
        self.res = apply(self.func, self.args)
        print '%s finished at:%s' % (self.name, time.strftime('%Y-%m-%d %H:%M:%S'))
        

 生产者-消费者代码如下:

 

#coding=utf-8
'''
Created on 2015年8月23日

@author: minmin
'''
import random
import time
import myThread
import Queue
import threading

'''
生产者,每nsleep秒生产nprod个产品,放入queue中
a 产品标记
name 生产者的名字
'''
def producer(queue, nsleep, nprod, name, a, lock):
    while True:
        for i in range(nprod):
            lock.acquire()
            queue.put(a[0], 1)
            print '%s生产了一个产品:%d, 当前队列大小:%d' % (name, a[0], queue.qsize())
            a[0] += 1
            lock.release()
        time.sleep(nsleep)

'''
消费着,每nsleep秒从queue中消费minProd至maxProd间随机产生的一个值的产品
name 消费者的名字
'''
def consumer(queue, nsleep, minProd, maxProd, name):
    while True:
        nprod = random.randint(minProd, maxProd)
        for i in range(nprod):
            val = queue.get(1)    
            print '%s消费了一个产品:%d, 当前队列大小:%d' % (name, val, queue.qsize())
            
        time.sleep(nsleep)

def main():
    
    queue = Queue.Queue(10)
    a = [0]
    
    lock = threading.Lock()
    
    producer1 = myThread.MyThread(producer, (queue, 1, 1, 'producer1', a, lock), 'producer1')
    producer2 = myThread.MyThread(producer, (queue, 1, 2, 'producer2', a, lock), 'producer2')
    consumer1 = myThread.MyThread(consumer, (queue, 1, 1, 5, 'consumer1'), 'consumer1')
    threads = [producer1, producer2, consumer1]
    
    for i in threads:
        i.start()
        
    for i in threads:
        i.join()
    
if __name__ == '__main__':
    main()
    

 运行结果如下:


 

 

 

 

 

代码我也放到GitHub上面了

 

 

  • 大小: 5.8 KB
  • 大小: 13.8 KB
3
3
分享到:
评论

相关推荐

    设计了生产者-消费者模拟演示系统。.zip

    设计了生产者-消费者模拟演示系统。生产者模拟多个进程生产指令放入指令队列中,消费者模拟处理机从指令队列中取出指令并映射为页进行处理,实现页面置换算法。利用Qt产生动画,模拟演示这一过程更加生动形象,可以...

    python之生产者消费者模型实现详解

    主要介绍了python之生产者消费者模型实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    生产者消费者问题.zip

    采用python3完成的生产者消费者问题,涉及到多线程、多线程队列,有需要的小伙伴们可以看看哎~ 欢迎交流学习~

    用Python的线程来解决生产者消费问题的示例

    我们将使用Python线程来解决Python中的生产者—消费者问题。这个问题完全不像他们在学校中说的那么难。 如果你对生产者—消费者问题有了解,看这篇博客会更有意义。 为什么要关心生产者—消费者问题: 可以帮你更好...

    python多进程下的生产者和消费者模型

    主要介绍了python多进程下的生产者和消费者模型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Python semaphore evevt生产者消费者模型原理解析

    主要介绍了Python semaphore evevt生产者消费者模型原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python rabbitMQ如何实现生产消费者模式

    主要介绍了Python rabbitMQ如何实现生产消费者模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python生成器实现简单"生产者消费者"模型代码实例

    主要介绍了Python生成器实现简单"生产者消费者"模型代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Confluent的Apache Kafka Python客户端-python

    = v0.8、Confluent Cloud 和 Confluent 平台兼容的高级生产者、消费者和 AdminClient。 客户端是: 可靠的 - 它是 librdkafka 的包装器(通过二进制轮自动提供),广泛部署在各种生产场景中。 它使用与 Java ...

    深入了解如何基于Python读写Kafka

    本篇会给出如何使用python来读写kafka, 包含生产者和消费者. 以下使用kafka-python客户端 生产者 爬虫大多时候作为消息的发送端, 在消息发出去后最好能记录消息被发送到了哪个分区, offset是多少, 这些记录在很多...

    bittorpy:在python中实现bittorrent引擎

    该体系结构是异步生产者-消费者模型的变体,也可以描述为具有多个主题的分布式发布者-订阅者,其中从同级下载的每个作品都作为主题添加到相应的文件编写器队列中,而文件编写者协程是该主题的订阅者文件编写器队列...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 生产者消费者模型 06 第三次作业讲解 第20章 01 上节课回顾 02 装饰器基本理论 03 高阶函数使用 04 函数闭包 05 函数闭包装饰器基本实现 06 函数闭包加上返回值 07 函数闭包加上参数 08 函数闭包补充:解压序列...

    爬虫学习中,结合数据库,利用异步多进程的生产者消费者模式的的一个k站爬虫(bushi).zip

    这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本...

    基于python的人脸识别毕业设计

    单的生产者消费者模型,从而提高了系统的识别效率,另外,对人脸的识别模块还 使用了 Python,C++混合编程技术引入了 Google 的开源深度学习框架 Tensorflow作 为对 FaceNet的具体实现,数据库使用的是 SQL Server...

    Python WXPY实现微信监控报警功能的代码

    架构涉及主要采用了 生产者消费者的涉及模式,使用Redis作为消息队列进行解耦操作。 主要架构涉及如下:   接下来开始介绍一下程序的实现过程,主要讲解wxpy -> python.redis -> Java.redis 1、Wxpy初体验 项目使用...

    大二上-大数据概论实验报告

    4. 生产者消费者模型 实验三 Python 数据分析 【实验内容】 利用机器学习算法构建模型,根据鸢尾花的花萼和花瓣大小,区分鸢尾花的品种。实现一个基础的三分类问题。 实验四 大数据可视化工具 ECharts 【实验内容】...

    asynckafka:用于异步的快速Kafka客户端

    特征使用平衡组的消费者消费者使用自定义主题分区和偏移量制片人该图书馆是作为一个学习Cython的项目而诞生的,并且在最近几年一直没有得到积极维护,因此应谨慎使用。例子简单的消费者如何使用消费者: consumer = ...

    Caffe学习笔记-粗糙版

    从头至尾阅读了Caffe全部源码,过程中写了这个笔记,写的比较粗糙,但是包含了Caffe中所有重要部分源码的解析(除python接口、具体Layer层和tools),包括多线程训练部分和datalayer的lmdb数据读取(生产者消费者)...

    python3爬虫中引用Queue的实例讲解

    就是一个先进先出的数据结构,而Python的标准库中提供了一个线程安全的队列,也就是说该模块是适用于多线程编程的先进先出(first-in,first-out,FIFO)数据结构,可以用来在生产者消费者线程之间安全地传递消息或...

    flyte:将您的ML和数据工作流加速进行生产。 Flyte是用于您的数据和ML工作负载的生产级编排系统。 它已经在Lyft,Spotify,freenome等公司进行了实战测试,并且真正开源

    按数据生产者-消费者顺序排列的多个任务将创建工作流。 Flyte工作流程是纯规范的,可以使用任何语言创建。 每个任务也可以用任何语言。 我们确实提供了对python的一流支持,使其非常适合现代机器学习和数据处理...

Global site tag (gtag.js) - Google Analytics