生产者、消费者问题,python实现

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

from threading import Thread
from threading import Lock
import time,random

pro_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: 12
!--product still in list, wait consumer to get it..
:::Consumer fetch: 12
:::Producer put: 75
!--product still in list, wait consumer to get it..
:::Consumer fetch: 75
!--No product now, wait producer put in...
:::Producer put: 28
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 28
:::Producer put: 94
:::Consumer fetch: 94

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值