首页 > 编程 > Python > 正文

Python实现的生产者、消费者问题完整实例

2020-02-15 21:33:41
字体:
来源:转载
供稿:网友

本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:

生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池(列表),生产者往里面放东西,消费者从里面取,规则是:列表为空的时候,生产者才能放东西;列表不为空的时候,消费者才能取东西;为了简单起见,暂定缓冲池中最多只能有一个产品。这里生产者和消费者共同操作一个资源:缓冲池,因此每次操作的时候,需要给资源加锁,操作结束时,释放锁,这样才能做到资源同步。使用python实现,需要继承Thread类,获取锁对象,代码如下:

# -*- coding:utf-8 -*-#! python2from threading import Threadfrom threading import Lockimport time,randompro_list = []lock = Lock()class Producer(Thread):  def run(self):    global pro_list    while True:      i = random.randint(0, 100)      lock.acquire()      if len(pro_list) > 0:        print "!--product still in list, wait consumer to get it.."      else:        pro_list.append(i)        print ":::Producer put:", pro_list[0]      lock.release()      time.sleep(2)class Consumer(Thread):  def run(self):    global pro_list    while True:      lock.acquire()      if len(pro_list) == 0:        print "!--No product now, wait producer put in..."      else:        print ":::Consumer fetch:", pro_list[0]        pro_list.pop(0)      lock.release()      time.sleep(2)Producer().start()Producer().start()Consumer().start()Producer().start()Producer().start()Consumer().start()Consumer().start()

这里使用多个生产者和消费者,共同操作缓冲池,部分执行结果如下:

:::Producer put: 78
!--product still in list, wait consumer to get it..
:::Consumer fetch: 78
:::Producer put: 99
!--product still in list, wait consumer to get it..
:::Consumer fetch: 99
!--No product now, wait producer put in...
:::Producer put: 12
:::Consumer fetch: 12
:::Producer put: 91
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 91
!--No product now, wait producer put in...
:::Producer put: 63
:::Consumer fetch: 63
:::Producer put: 85
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 85
!--No product now, wait producer put in...
:::Producer put: 1
:::Consumer fetch: 1
:::Producer put: 26
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 26
!--No product now, wait producer put in...
:::Producer put: 8
:::Consumer fetch: 8
:::Producer put: 19
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表