python生产者消费者_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()

运行结果如下图:

f044f1ba-bd39-3288-b1bf-f69c14339f38.png

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()

运行结果如下:

cf7ab03a-771b-3735-86ce-8c6a5952c29c.png

代码我也放到GitHub上面了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值