全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件
21492 100
2014-06-16
来自Python视频主讲阎老师:
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。
   
# -*- coding: gbk -*-  
import threading, time

milk = 0
pool_size = 100 #池的大小
mylock =  threading.RLock()
class producer(threading.Thread):   
    """生产者,主要的业务逻辑为 往池中加入milk,以备消费者使用"""
    def __init__(self, step, theadName):
          threading.Thread.__init__(self)
          self.step = step        
          self.isRunable = True
          self.threadName =  theadName
    def run(self):
          global milk
          while True and self.isRunable:
               time.sleep(2)
               mylock.acquire();
               if(milk >= pool_size):
                     print "[生产者]池中的milk已经足够多[%dL],怎么就没有人来买?" % (milk)
               else:
                     interval =  pool_size - milk  #防止池溢出,造成浪费
                     if(interval < self.step):
                         milk = pool_size
                     else:
                         interval = self.step
                         milk += self.step


                     print "[生产者]名称:%s 生产了 %dL 的milk 加入了池中, 池中的总量为 %dL"   % (self.threadName, interval, milk)
                mylock.release()
          else:
                print "干了一天了,准备休息了拜拜了!"
    def stop(self):
        self.isRunable = False

class customer(threading.Thread):

      def __init__(self, amount , theadName):
            threading.Thread.__init__(self)
            self.amount  = amount         
            self.isRunable = True
            self.threadName =  theadName
    def run(self):
          global milk
          while True and self.isRunable:
                time.sleep(5)
                mylock.acquire();
                if(milk > self.amount ) :
                    milk -= self.amount
                    print "[消费者]名称 %s 新鲜的milk,我要开始消费了,老板来%dL"  % (self.threadName, self.amount)
              else:
                    print "[消费者]池中的milk不足够我消费,等待中....."
              mylock.release()
        else:
              print "差不多了,货都买齐了,准备撤了!"
    def stop(self):        
          self.isRunable = False                  
if __name__ == "__main__":
      p1 = producer(10, "小奶牛")
      p2 = producer(20, "老奶牛")
      p1.start()
      p2.start()

      c1 =  customer(5, "路人甲")
      c2 =  customer(4, "路人乙")
      c3 =  customer(5, "杨白劳")

      c1.start()
      c2.start()
      c3.start()

      time.sleep(2*60) #准备结束
      p1.stop()
      p2.stop()

      c1.stop()
      c2.stop()
            
值得注意的是,python对格式的要求近乎苛刻,有几个循环同时出现在一段程序中的时候,要更加留意缩进问题,失之毫厘谬之千里。
     
Python作为新起潮流科学计算明星语言,其逻辑更加人性化,功能也丝毫不输给R这样强大的语言~
Python数据分析应用
从起步到应用 一次搞定
Python数据分析近20个小时的全程视频
基础(600元)+高级(800元)=全程1200元
初级:http://www.peixun.net/view/304.html
高级:http://www.peixun.net/view/338.html

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-6-16 09:06:44
支持一下了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-6-16 09:09:25
学习了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-6-16 09:09:25
顶一个。。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-6-16 09:17:43
支持一下了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-6-16 09:41:30
厉害啊,支持
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群