楼主: 资料狂人
21967 100

[学科前沿] 【Python】用Python实现多线程“生产者-消费者”模型的简单例子   [推广有奖]

运营管理员

已卖:77份资源

巨擘

0%

还不是VIP/贵宾

-

威望
9
论坛币
970839307 个
通用积分
45669.8360
学术水平
4658 点
热心指数
3445 点
信用等级
3661 点
经验
747537 点
帖子
10314
精华
142
在线时间
19502 小时
注册时间
2010-5-11
最后登录
2025-12-31

初级热心勋章 初级学术勋章 中级学术勋章 中级热心勋章 初级信用勋章 中级信用勋章 高级学术勋章 高级热心勋章 高级信用勋章 特级信用勋章 特级学术勋章

楼主
资料狂人 在职认证  发表于 2014-6-16 09:00:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
来自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

二维码

扫码加我 拉你入群

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

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

关键词:python 消费者 生产者 多线程 Python数据分析 消费者 多线程 生产者 模型

已有 1 人评分学术水平 热心指数 收起 理由
hbsxj2011 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

本帖被以下文库推荐



沙发
chengganglee 发表于 2014-6-16 09:06:44

回帖奖励 +2

支持一下了

藤椅
vox_han 发表于 2014-6-16 09:09:25

回帖奖励 +2

学习了

板凳
hanxianfeng 发表于 2014-6-16 09:09:25

回帖奖励 +2

顶一个。。。

报纸
cglee 发表于 2014-6-16 09:17:43

回帖奖励 +2

支持一下了

地板
Edwardliu 在职认证  发表于 2014-6-16 09:41:30

回帖奖励 +2

厉害啊,支持

7
tmg3081 发表于 2014-6-16 09:48:22

回帖奖励 +2

非常好,谢谢分享

8
darwon 发表于 2014-6-16 09:51:28

回帖奖励 +2

支持一下!

9
kevinion 发表于 2014-6-16 10:01:27

回帖奖励 +2

绝对支持!

10
6851934lyy 发表于 2014-6-16 10:03:02

回帖奖励 +2

顶一个                  

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-31 19:32