认识生产者和消费者模式

生产者和消费者是多线程中很常见的一个问题。产生数据的模块,我们称之为生产者,而处理数据的模块,就称为消费者。但是单单只有生产者和消费者显然还是不够的,一般来说,我们还有一个缓冲区,抽象出来的流程如下图所示。

将这个过程以实际例子来说明:

假如我们是一个生产辣条的厂家,我们生产出来的辣条肯定是一箱一箱地放在仓库里面,然后卖出去给消费者。【不再考虑经销商环节】

1.我们把一箱一箱的辣条生产好。——>>>相当于生产者制造数据

2.我们把辣条放到仓库中。——>>>相当于将数据放到缓冲区

3.我们把辣条给取出来。——>>>相当于把数据从缓冲区取出

4.我们把取出的辣条卖给消费者吃掉。——>>>相当于从缓冲区出来的数据经过了处理

应用于爬虫

生产者:不断产生待爬取的url。【比如需要下载图片,此时就需要不断获取图片的url】

缓冲区:将获取到的url进行储存。

消费者:对生产者获取到的url从缓冲区拿出来,然后发起请求。【相当于对下载url】

对于通用爬虫(单线程)来说,我们拿到一个图片的url,然后就进行下载,效率太低。

对于异步爬虫(多线程)来说,我们可以同时从缓冲区取出多个图片的url,然后一次多张下载。

Queue队列线程安全

当采用多线程的生产者和消费者模式时,生产者生产出来的数据【对应于爬虫爬取到的图片url】,将其储存于缓冲区,【缓冲区即全局变量】,此时必然面临一个问题,就是数据不同步【数据错乱】等问题,后续再执行操作就存在一定问题了。

再举个例子:

比如有一个列表为A=[0],此时去修改里面的值,修改实际上分为两步:第一步是选取到那个元素,第二步才是赋值修改。如果说是多线程来执行这个操作,就有可能会发生一些意想不到的错误。比如第一个线程要赋值为1,第二个线程要赋值为2。按照我们正常的理解,最终结果应该是2,但是对于多线程来说,它的结果也有可能是1。

考虑这一种情况,当线程1选定了A[0],此时切换到了线程2,然后线程2选定了A[0],并且执行了下一步赋值的操作,这样就先将A这个列表赋值为2了,接着再次切换到了线程1,此时线程1完成赋值(因为在前面已经选定),此时最终结果变为1。所以多线程总是会面临各种数据不安全的问题。

解决方案:

1.加锁机制(已经讲过)

2.Queue队列线程安全。

什么是Queue队列线程安全?

类似列表,但又不是列表。

在Python中提供了同步的、线程安全的队列类,这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步,即保证数据不会乱掉。

众多python培训视频,尽在python学习网,欢迎在线学习!

本文转自:https://blog.csdn.net/weixin_42830697/article/details/102957950

python 生产者和消费者模式_Python爬虫:生产者和消费者模式相关推荐

  1. python爬取收费素材_Python爬虫练习:爬取素材网站数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在工作中的电子文案.ppt,生活中的新闻.广告,都离不开大量的素材,而素材 ...

  2. python通过ip池爬_python 爬虫 代理ip池(适合初学者)

    初次学习python爬虫的朋友在频繁访问被爬取页面网站时都会被拦截,也就是限制ip.这里教教大家建立代理ip池. #!/usr/bin/env python3# -*- coding: utf-8 - ...

  3. python爬虫模式_python爬虫的入门试炼

    网络爬虫初解: 如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序: ...

  4. python可以开多少线程_python爬虫可以开多少线程?

    其实关于爬虫并没有明确多少数量开线程,因为这个是无穷的,随着时代的不断发展,每一个革新都给我们焕然一新的感觉,可能大家现在在学习的时候,已知内容是有限的,真正在不断探索以后,会发现这个内容是无穷了,小 ...

  5. python高阶面试题_Python 爬虫面试题 170 道:2019 版

    通过本场 Chat,你将获得如下知识点:掌握 Python 的基础语法 语法常见的 Python 应用场景 掌握 Python 闭包的使用以及装饰器的使用 生成器和迭代器的使用 常见的设计模式的使用 ...

  6. python爬取小说基本信息_Python爬虫零基础实例---爬取小说吧小说内容到本地

    Python爬虫实例--爬取百度贴吧小说 写在前面本篇文章是我在简书上写的第一篇技术文章,作为一个理科生,能把仅剩的一点文笔拿出来献丑已是不易,希望大家能在指教我的同时给予我一点点鼓励,谢谢. 一.介 ...

  7. python手机壁纸超清_Python爬虫-王者荣耀高清壁纸下载

    绪论 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.python是一种跨平台的计算机程序设计语言.是一种 ...

  8. python微信爬取教程_PYTHON爬虫之旅系列教程之【利用Python开发微信公众平台一】...

    感谢大家的等待,好啦,都准备好瓜子.板凳,老司机要发车啦-- 本系列课程讲述"PYTHON爬虫之旅",具体大纲可参考:[PYTHON爬虫之旅]概要目录. 本节课讲述如何利用Pyth ...

  9. python爬取豆瓣小组_Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图

    目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import json from PIL import Image from pyqu ...

最新文章

  1. 机器学习泰斗迈克尔 · 乔丹:不是什么都叫AI的
  2. JAVA从下载到浏览器运行完整篇,写给lewis
  3. Python-爬取2345电影并写入文件
  4. PHP获取用户地址方法
  5. MYSQL中用正则筛选一定的数据
  6. Java内存模型和优化
  7. Linux 如何通过某一台服务器调用执行多台远程服务器上的脚本,结果显示在本地?...
  8. 新晋千元王者!红米Note 8系列发布:999元起,价格真香
  9. Java Elasticsearch 使用
  10. GTK 4.0 图形工具包正式发布
  11. python中的as是什么意思_python中as用法实例分析
  12. python编程是什么东西_编程python是什么
  13. c语言程序设计商品管理系统
  14. 小程序嵌套h5界面,在h5界面调用小程序的扫一扫功能
  15. 如何在Cell里画出虚线?
  16. Redis中的TTL
  17. 小米HR:说说对API有多少的理解? 看了后,和面试官扯皮,吹牛逼!绰绰有余!
  18. 树、二叉树(完全二叉树、满二叉树)概念图解
  19. Python PyQt5
  20. 关于电子科技大学本科生宿舍热水情况调查

热门文章

  1. DPM(Deformable Parts Models)-----目标检测算法理解
  2. 科大星云诗社动态20210310
  3. 科大星云诗社动态20210813
  4. 【SVM最后一课】详解烧脑的Support Vector Regression
  5. linux用户和群组的作用,linux中的用户、群组和权限
  6. 在matlab中intcon什么意思,GADST,你为何这么叼?(一)
  7. 30分钟正则表达式指导
  8. delphi 垃圾回收框架
  9. 让delphi2010操作界面回到delphi7模式
  10. 用diff命令制作补丁