前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶-生产者-消费者

Python进阶-生产者-消费者

作者头像
小团子
发布2019-07-18 15:29:27
4640
发布2019-07-18 15:29:27
举报
文章被收录于专栏:数据云团数据云团

生产者-消费者问题的实现使用了 Queue 对象,以及随机生产(消费)的商品的数量。生产者和消费者独立并且并发地执行线程。

代码语言:javascript
复制
import threading
from random import randint
from time import sleep, ctime
from queue import Queue

class MyThread(threading.Thread):
  def __init__(self, func, args, name=''):
    threading.Thread.__init__(self)
    self.name = name
    self.func = func
    self.args = args
  
  def getResult(self):
    return self.res
  
  def run(self):
    print("开始", self.name, ctime())
    self.res = self.func(*self.args)
    print("结束", self.name, ctime())

把结果保存在实例属性 self.res 中,并创建一个新的方法 getResult() 来获取这个值。

代码语言:javascript
复制
from random import randint
from time import sleep
from queue import Queue

def writeQ(queue):
  print("生产对象", queue.put("xxx", 1))
  print("大小", queue.qsize())
  
def readQ(queue):
  val = queue.get(1)
  print("从生产对象中消费", queue.qsize())
  
def writer(queue, loops):
  for i in range(loops):
    writeQ(queue)
    sleep(randint(1, 3))
 
def reader(queue, loops):
  for i in range(loops):
    readQ(queue)
    sleep(randint(2, 5))

funcs = [writer, reader]
nfuncs = range(len(funcs))

def main():
  nloops = randint(2, 5)
  q = Queue(32)
  
  threads = []
  for i in nfuncs:
    t = MyThread(funcs[i], (q, nloops), funcs[i].__name__)
    threads.append(t)
  
  for i in nfuncs:
    threads[i].start()
  
  for i in nfuncs:
    threads[i].join()
  
  print("执行完毕")

if __name__ == "__main__":
  main()
  • writeQ() 和 readQ() 函数分别用于将一个对象放入队列中和消费队列中的一个对象。每次只会生产或读取一个对象。
  • writer() 作为单线程运行,向队列中放入一个对象。
  • writer 睡眠的随机秒数通常比 reader 的要短;为了阻碍 reader 从空队列中获取对象。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档