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上面了

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值