`

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

    生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...

    Producers-and-consumers.rar_操作系统 演示_生产者消费者

    6. **示例代码**:"生产者-消费者算法演示"可能包含了用某种编程语言(如C++、Java或Python)实现的生产者和消费者模型,通过运行这个程序,我们可以直观地理解如何在代码层面解决这个问题。 在学习这个模型时,...

    kafka模拟生产者消费者(集群模式)实例

    在本文中,我们将深入探讨如何在集群模式下模拟Kafka的生产者和消费者。Kafka是一种分布式流处理平台,常用于大数据实时处理和消息传递。它由Apache开发,以其高吞吐量、低延迟和可扩展性而闻名。 首先,我们要理解...

    生产者消费者问题.zip

    本示例中,`生产者消费者问题.zip`包含了一个Python3实现的解决方案,文件名为`learn_17_multithreading_bymyself.py`。这个程序利用了Python的`threading`模块来创建和管理线程,以及`queue`模块来作为生产者和消费...

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

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

    Spark编程挑战题目

    通过挖掘客户的购买行为,企业可以更好地理解消费者的偏好,从而制定更有效的营销策略。 **技术要点:** 1. **数据准备:** - 收集并整理购买记录数据。 - 数据清洗,去除异常值和缺失值。 2. **关联规则算法:**...

    生产者消费者演示程序

    通过对这个代码的分析和学习,我们可以更深入地理解多线程同步以及生产者消费者模式在实际应用中的实现方法。 总之,生产者消费者问题是多线程编程中的一个重要概念,它展示了如何通过同步机制来协调不同任务之间的...

    操作系统实验报告_进程同步与互斥.doc

    3. 生产者-消费者问题:生产者-消费者问题是一个经典的同步问题,描述了生产者生产产品并存入缓冲区,而消费者从缓冲区取出产品的过程。 4. Windows 2000/XP 中的同步对象:Windows 2000/XP 中提供了多种同步对象,...

    Python库 | kafkahelpers-0.3.0-py3-none-any.whl

    2. **主题和分区管理**:库可能包含对Kafka主题的创建、删除和查询功能,以及对分区的管理,如分配消费者到不同的分区,确保数据均衡处理。 3. **错误处理和重试机制**:在处理分布式系统中的故障时,错误处理和重...

    Python库 | kafka_transport-0.7.3-py3-none-any.whl

    在`kafka_transport`库中,核心概念是构建了一个稳定的Kafka生产者和消费者模型。生产者负责将消息发送到Kafka主题,而消费者则从主题中读取消息。这个库采用了异步I/O模型,允许在等待网络响应时执行其他任务,从而...

    Python-Confluent的ApacheKafkaPython客户端

    **三、生产者与消费者** 1. **生产者(Producer)**: 生产者负责将消息发布到Kafka主题。创建一个生产者实例,然后调用`produce`方法发送消息: ```python producer = Producer(config) producer.produce('my-...

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

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

    Sqlite3+RabbitMQ+Celery Python从零开始搭建一个生产者消费者服务模型配套安装文件

    4. 搭建生产者-消费者模型:编写生产者代码,发布任务到RabbitMQ。编写消费者代码,订阅RabbitMQ中的任务,接收到任务后执行相应的业务逻辑。 5. 测试和优化:测试整个流程,确保生产者能够正确发布任务,消费者...

    Python-ApacheKafkaStreams的Python实现

    2. **Producer**: 生产者是向 Kafka Topic 发送数据的应用程序。 3. **Consumer**: 消费者从 Kafka Topic 中读取数据。 4. **Streams**: 在 Kafka Streams 中,数据被处理为连续的记录流,这些流可以进行转换和...

    kafka-python

    在Python中,`kafka-python`库提供了Producer类,用于创建生产者实例并发送消息。 4. **消费者(Consumer)**:消费者订阅主题,从Kafka集群中拉取数据。`kafka-python`库提供了Consumer类,用于创建消费者实例并...

    python3.5全栈工程师零基础到项目实战全套

    - **消息模式**:生产者-消费者模型的应用。 ##### 12.Python3.5与MySql数据库 - **SQL基础**:SQL语言的基本概念和常用操作。 - **连接MySQL数据库**:使用Python连接MySQL数据库的方法。 - **ORM框架**:通过ORM...

    Криволапов, Хрипунова -- Математика на Python -- 2022.pdf

    - **经济学**:研究资源分配、生产、消费等方面的学科。 - **线性代数**:研究线性方程组、向量空间等数学结构的分支。 - **数学分析**:探讨函数、极限、微分等概念及其应用的数学领域。 ### 六、书籍价值与特点 ...

    Python库 | amqp_connection-1.4.3.tar.gz

    `amqp_connection`库使得Python程序能够轻松地连接到这些消息队列服务,进行生产者(发送消息)和消费者(接收消息)的角色切换。 在`amqp_connection-1.4.3.tar.gz`压缩包中,我们可以期待找到以下内容: 1. `...

    kafka运行实例

    在这个"Kafka运行实例"中,你将找到运行Kafka所需的所有必要组件,包括Kafka服务器、生产者(producer)和消费者(consumer)的示例。 首先,我们需要理解Kafka的基本概念。Kafka的核心是主题(Topic),它是数据...

Global site tag (gtag.js) - Google Analytics