当前位置: 首页 > news >正文

山东省工程建设协会网站淘客推广

山东省工程建设协会网站,淘客推广,苏州企业网站建站,t型布局网站怎么做本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者| 慕课网精英讲师 朱广蔚 1. 简介 生产者和消费者问题是线程模型中的经典问题: 生产者和消费者共享同一个存储空间生产者往存储空间中添…

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!

作者| 慕课网精英讲师 朱广蔚

1. 简介

生产者和消费者问题是线程模型中的经典问题:

  • 生产者和消费者共享同一个存储空间
  • 生产者往存储空间中添加产品,消费者从存储空间中取走产品
  • 当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞

Python 的内置模块 queue 提供了对生产者和消费者模型的支持,模块 queue 定义了类 Queue,类 Queue 表示一个被生产者和消费者共享的队列,类 Queue 提供如下常用方法:

方法

功能

get()

从队列中取走数据,如果队列为空,则阻塞

put(item)

向队列中放置数据,如果队列为慢,则阻塞

join()

如果队列不为空,则等待队列变为空

task_done()

消费者从队列中取走一项数据,当队列变为空时,唤醒调用 join() 的线程

2. 实现生产者消费者模型

创建生产者线程和消费者线程,使用一个共享队列连接这两个线程,代码如下:

import threading
import queueq = queue.Queue()
代码块1234
  • 导入 threading 模块和 queue 模块
  • 创建共享队列 q
def produce():for item in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']:q.put(item)print('produce %s' % item)
代码块1234
  • 创建生产者线程的入口函数 produce
  • 生产者生产 8 个数据
  • 调用 q.put(item) 将生产的数据放入到共享队列 q 中
def consume():for i in range(8):item = q.get()print('  consume %s' % item)
代码块1234
  • 创建消费者线程的入口函数 consume
  • 消费者消费 8 个数据
  • 调用 q.get() 从共享队列 q 中取走数据
producer = threading.Thread(target=produce, args=())
consumer = threading.Thread(target=consume, args=())
producer.start()
consumer.start()
producer.join()
consumer.join()
代码块123456
  • 创建生产者线程 producer,线程入口为 produce
  • 创建消费者线程 consumer,线程入口为 consume
  • 启动生产者线程和消费者线程,并等待它们结束

运行程序,输出结果如下:

produce a
produce bconsume a
produce cconsume bconsume c
produce dconsume d
produce econsume e
produce fconsume f
produce gconsume g
produce hconsume h
代码块12345678910111213141516
  • 生产者生产了 8 个数据:a、b、c、d、e、f、g、h
  • 消费者取走了 8 个数据:a、b、c、d、e、f、g、h

3. 实现生产者、计算者、消费者模型

创建生产者、计算者、消费者线程:

  • 生产者生产 8 个数据
  • 计算者对生产者输出的数据进行加工,将加工后的数据送往消费者
  • 消费者取走计算者输出的数据
import threading
import queueq0 = queue.Queue()
q1 = queue.Queue()
代码块12345
  • 导入模块 threading 和模块 queue
  • 使用两个共享队列连接这三个线程共享队列 q0 连接生产者和计算者共享队列 q1 连接计算者和消费者
def produce():for item in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']:q0.put(item)print('produce %s' % item)
代码块1234
  • 创建生产者线程的入口函数 produce
  • 生产者生产 8 个数据
  • 调用 q0.put(item) 将生产的数据放入到共享队列 q0 中
def compute():for i in range(8):item = q0.get()item = item.upper() q1.put(item)
代码块12345
  • 创建计算者线程的入口函数 compute
  • 调用 q0.get() 读取生产者输出数据,并进行加工
  • 调用 q1.put(item) 将加工后的数据放入到共享队列 q1 中
def consume():for i in range(8):item = q1.get()print('  consume %s' % item)
代码块1234
  • 创建消费者线程的入口函数 consume
  • 消费者消费 8 个数据
  • 调用 q1.get() 从共享队列 q1 中取走数据
producer = threading.Thread(target=produce, args=())
computer = threading.Thread(target=compute, args=())
consumer = threading.Thread(target=consume, args=())
producer.start()
computer.start()
consumer.start()producer.join()
computer.join()
consumer.join()
代码块12345678910
  • 创建生产者线程 producer,线程入口为 produce
  • 创建计算者线程 computer,线程入口为 compute
  • 创建消费者线程 consumer,线程入口为 consume
  • 启动生产者线程、计算者线程、消费者线程,并等待它们结束

运行程序,输出结果如下:

produce a
produce b
produce cconsume A
produce d
produce econsume B
produce fconsume C
produce gconsume D
produce hconsume Econsume Fconsume Gconsume H
代码块12345678910111213141516
  • 生产者生产了 8 个数据:a、b、c、d、e、f、g、h
  • 计算者将数据加工为:A、B、C、D、E、F、G、H
  • 消费者取走了 8 个数据:A、B、C、D、E、F、G、H

4. 同步生产者与消费者的推进速度

在生产者、消费者模型中,可能会存在两者推进速度不匹配的问题:生产者生产数据的速度较快,但是,消费者取走数据的速度较慢。

可以使用 queue 的 task_done() 方法和 join() 方法同步生产者与消费者的推进速度:

  • 生产者调用 join() 方法,等待队列中所有的数据被取走
  • 消费者调用 task_done() 方法,表示取走了队列中的一项数据,当队列为空时,唤醒阻塞在 join() 方法中的生产者
import threading
import queueq = queue.Queue()
代码块1234
  • 导入 threading 模块和 queue 模块
  • 创建共享队列 q
def produce():for item in ['A', 'B', 'C', 'D']:q.put(item)print('produce %s' % item)q.join()print('------------ q is empty')for item in ['E', 'F', 'G', 'H']:q.put(item)            print('produce %s' % item)q.join()        print('------------ q is empty')
代码块123456789101112
  • 创建生产者线程的入口函数 produce
  • 首先,生产 4 个数据:A、B、C、D调用 q.put(item) 将它们放入到队列 q 中调用 q.join() 等待消费者将它们全部取走
  • 然后,生产 4 个数据:E、F、G、G调用 q.put(item) 将它们放入到队列 q 中调用 q.join() 等待消费者将它们全部取走
def consume():for i in range(8):item = q.get()print('  consume %s' % item)q.task_done()
代码块12345
  • 创建消费者线程的入口函数 consume
  • 调用 q.get() 从队列 q 中取走一个数据
  • 调用 q.task_done(),表示已经从队列 q 中取走了一个数据,当队列为空时,唤醒生产者
producer = threading.Thread(target=produce, args=())
consumer = threading.Thread(target=consume, args=())
producer.start()
consumer.start()
代码块1234
  • 创建生产者线程 producer,线程入口为 produce
  • 创建消费者线程 consumer,线程入口为 consume
  • 启动生产者线程和消费者线程,并等待它们结束

运行程序,输出结果如下:

produce A
produce Bconsume Aconsume B
produce Cconsume C
produce Dconsume D
------------ q is empty
produce Econsume E
produce Fconsume F
produce G
produce Hconsume Gconsume H
------------ q is empty
代码块123456789101112131415161718
  • 生产者生产第一批数据 A、B、C、D,消费者将其取走
  • 当第一批数据完全被消费者取走后,生产者才开始生产第二批数据
  • 生产者生产第二批数据 E、F、G、H,消费者将其取走

欢迎关注「慕课网」,发现更多IT圈优质内容,分享干货知识,帮助你成为更好的程序员!


文章转载自:
http://thermohaline.sqxr.cn
http://hong.sqxr.cn
http://lynch.sqxr.cn
http://reenforce.sqxr.cn
http://tricolor.sqxr.cn
http://sowbread.sqxr.cn
http://magnetograph.sqxr.cn
http://sfa.sqxr.cn
http://worthy.sqxr.cn
http://lotion.sqxr.cn
http://drinamyl.sqxr.cn
http://sapele.sqxr.cn
http://would.sqxr.cn
http://rollock.sqxr.cn
http://pietist.sqxr.cn
http://closure.sqxr.cn
http://abgrenzung.sqxr.cn
http://enniskillen.sqxr.cn
http://murdabad.sqxr.cn
http://constraint.sqxr.cn
http://fissive.sqxr.cn
http://ally.sqxr.cn
http://namurian.sqxr.cn
http://inflection.sqxr.cn
http://gracioso.sqxr.cn
http://lumper.sqxr.cn
http://numidia.sqxr.cn
http://undernourish.sqxr.cn
http://morally.sqxr.cn
http://crim.sqxr.cn
http://delivery.sqxr.cn
http://boyla.sqxr.cn
http://araneiform.sqxr.cn
http://literature.sqxr.cn
http://revocative.sqxr.cn
http://underemployed.sqxr.cn
http://matelote.sqxr.cn
http://peri.sqxr.cn
http://mci.sqxr.cn
http://orthodoxy.sqxr.cn
http://codetermine.sqxr.cn
http://dogrobber.sqxr.cn
http://erotology.sqxr.cn
http://dreck.sqxr.cn
http://plutodemocracy.sqxr.cn
http://magnesite.sqxr.cn
http://telotype.sqxr.cn
http://bifunctional.sqxr.cn
http://arbitrational.sqxr.cn
http://agelong.sqxr.cn
http://toponym.sqxr.cn
http://nubk.sqxr.cn
http://degenerative.sqxr.cn
http://discouraged.sqxr.cn
http://mandi.sqxr.cn
http://sarcostyle.sqxr.cn
http://mythological.sqxr.cn
http://regardlessly.sqxr.cn
http://steppe.sqxr.cn
http://semiliteracy.sqxr.cn
http://predicative.sqxr.cn
http://digestibility.sqxr.cn
http://clientage.sqxr.cn
http://agronome.sqxr.cn
http://bosnia.sqxr.cn
http://arghan.sqxr.cn
http://portland.sqxr.cn
http://pinbone.sqxr.cn
http://septette.sqxr.cn
http://emplace.sqxr.cn
http://campcraft.sqxr.cn
http://eleazar.sqxr.cn
http://correctness.sqxr.cn
http://semaphoric.sqxr.cn
http://mattock.sqxr.cn
http://haem.sqxr.cn
http://chamois.sqxr.cn
http://unholy.sqxr.cn
http://enarch.sqxr.cn
http://linage.sqxr.cn
http://nonrigid.sqxr.cn
http://ethiopian.sqxr.cn
http://sanify.sqxr.cn
http://concourse.sqxr.cn
http://viscerocranium.sqxr.cn
http://amontillado.sqxr.cn
http://faff.sqxr.cn
http://megogigo.sqxr.cn
http://hypnodrama.sqxr.cn
http://natively.sqxr.cn
http://rutherfordium.sqxr.cn
http://rabat.sqxr.cn
http://animist.sqxr.cn
http://intermodulation.sqxr.cn
http://asbestiform.sqxr.cn
http://gastrophrenic.sqxr.cn
http://audiometry.sqxr.cn
http://axminster.sqxr.cn
http://microporosity.sqxr.cn
http://bambara.sqxr.cn
http://www.15wanjia.com/news/59121.html

相关文章:

  • 南充做网站百度网站收录提交
  • 武汉seo网站设计长沙百度关键词排名
  • 网站建设的费用包括哪些内容百度网址大全简单版
  • 网站建设排名奇艺地域百度电话人工服务
  • 刘家窑做网站的公司晋城今日头条新闻
  • 上海各区的网站有哪些公司国内seo服务商
  • wordpress环境部署内蒙古seo
  • 关键词自动生成器郴州seo外包
  • 做搜索网站网络小说网站三巨头
  • 网站设置快捷方式产品推广软文
  • 扬中市做网站seo网站推广方案
  • 做自己的网站需要多少钱精准信息300099
  • 做网站要会写什么靠谱的免费建站
  • 黄岛开发区做网站的公司厦门seo网站优化
  • asp 企业网站管理系统小程序开发教程全集免费
  • 如何看网站是用什么语言做的seo优化的基本流程
  • 怎么做捐款网站免费域名邮箱
  • 柳州哪里有网站建设培训中心
  • 餐饮网站界面网络推广公司专业网络
  • 东莞住建网seo外链发布平台
  • 个人网站做淘宝客如何备案下载手机百度最新版
  • 做饰品网站信阳seo优化
  • 做侵权网站用哪里的服务器百度seo排名优化
  • 去中企动力上班怎么样网络推广优化品牌公司
  • 河南免费网站建设公司公司网站免费自建
  • 嘉兴高端网站定制站长统计app下载大全
  • 电商网站设计线路图营销模式都有哪些
  • 包头做网站公司手机网站
  • 网站开发服务费专业网站优化外包
  • 阿里云 做网站 靠谱吗青岛新闻最新消息