背景:

  我们知道多线程要比多进程效率更高,因为线程存在于进程之内,打开一个进程的话,首先需要开辟内存空间,占用内存空间比线程大。这样想也不怪,比如一个进程用10MB,开10个进程就得100MB的内存空间。但是我们开线程的话,只需要开通一个进程,在进程里面再开10个线程,这样的话内存空间只需要10MB就开了,这么想也是对的,但是、但是。

GIL:

  又名全局解释器锁,python在设计当初(那个年代哪来的多核,电脑都没来普及),也是python的一个设计思想,为了数据安全,怎么个为数据安全考虑呢(一个进程里面只有一个GIL锁),即同一时间只能一个事件发生,我们来捋一下请求过程,第一个线程过来拿到任务,向python申请GIL锁,拿到锁以后条用os的原生线程,然后再调用CPU,python2这个时候有个问题,为了实现多线程并行效果(cpu的上下文切换),它有一个ticke计数,只要达到100后释放,或者这个时候有IO操作,就会切换到下一个线程。但是这里我有个问题,如果就是同时开两个线程的话,就是两个线程的同时切换,如果我开了5个线程,第一个线程切换的时候,其它4个线程要申请GIL锁才能执行操作,但是这个GIL锁给谁呢?这个时候就会出现一个竞争,会消耗资源(别忘了,python通一个时间值有一下事件再执行),这个就是python在多核CPU上的利用率并没有那么优秀。

  python3的不在使用ticke计数器,而是用计时器,这样的话对CPU密集运算的操作有所提升,但同一时间那还不是只有一个线程在工作(还是利用cpu的上下文切换,实现的并行效果,只是你没看出来而已)。

这么说多线程就真是鸡肋了么?

  CPU密集运算的环境下,即使开的线程再多(不是说线程越多越快,这个数量要适量),我们都知道了python在同一时刻只有一个线程在工作,一个进程只有一个GIL锁,所以不管再多的线程,同一时间就一个线程在工作,对于CPU运算的环境下,意义不大,有点单线程的样子。

  但是对于IO操作密集的环境话(比如数据的持久化操作),效果就会好很多。比如线程A,干完CPU运算的时候去写入文件或者数据库的时候,获取爬虫去请求的时候,这个时候就切换到线程B,这样的话多线程的效率还是较高的。

那相比之下怎么提高效率呢?

  我们知道线程存在于进程内,也就微进程。每个进程里面看有一个GIL锁,开启一个进程的话需要开通内存空间(俗称占内存),但是开线程的话,它是存在于进程内的,所以如果开10个进程和开10线程的话,线程占用的内存空间更小。可是多线程效率并没有那个高啊,怎么办,有人说,我内存你大,我开进程,开10个进程,进程里面有个自己的GIL锁,这样的话,不就等于并行了么,对的,可以整。

python爬虫之多线程、多进程、GIL锁的更多相关文章

  1. python爬虫之多线程、多进程+代码示例

    python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...

  2. python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型

    线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

  3. Python爬虫之多线程下载豆瓣Top250电影图片

    爬虫项目介绍   本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:   本次爬虫项目将分别不使用多线程和使 ...

  4. Python爬虫之多线程

    详情点我跳转 关注公众号"轻松学编程"了解更多. 多线程 在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全 ...

  5. Python爬虫之多线程下载程序类电子书

      近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下:   那么我们是否可以通过Py ...

  6. Python爬虫进阶 | 多线程

    一.简介 为了提高爬虫程序效率,由于python解释器GIL,导致同一进程中即使有多个线程,实际上也只会有一个线程在运行,但通过request.get发送请求获取响应时有阻塞,所以采用了多线程依然可以 ...

  7. python学习之多线程多进程

    python基础 进程&线程 进程是一组资源的集合,运行一个系统就是打开了一个进程,如果同时打开了两个记事本就是开启了两个进程,进程是一个笼统的概念,进程中由线程干活工作,由进程统一管理 一个 ...

  8. 爬虫之多线程 多进程 自定义异步IO框架

    什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...

  9. 【新手必学】Python爬虫之多线程实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:清风化煞_   正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...

随机推荐

  1. Visual Studio Code 支持TensorFlow配置支持

    首先选择解释器 选择TensorFlow版本的conda版本 (当然你如果是通过python单独安装的TensorFlow也可以) 编辑器输入代码,进行测试 import tensorflow as ...

  2. python入门学习:8.类

    python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类   面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...

  3. linux+node.js+redis+mongodb+nginx环境的搭建

    1.推荐购买阿里云服务器,使用Centos7.0的服务器版本,在创建完全系统并进入之后,第一步是更新服务器的相关组件    yum -y install gcc gcc-c++ openssl-dev ...

  4. AI VGG16

    VGG(Visual Geometry Group) 16 参考链接: https://arxiv.org/abs/1409.1556

  5. # 20175329 2018-2019-2 《Java程序设计》 第二周学习总结

    学号 2018-2019-3<Java程序设计>第二周学习总结 教材学习内容总结      第二三章与我们所学习的C语言有很多的相似点,在这里我想主要就以我所学习的效果来讨论一下JAVA与 ...

  6. java 基础 instance of

    a instance of b   a是否是b类的实例对象 返回 bool值

  7. Apache Spark 内存管理详解(转载)

    Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 ...

  8. 天坑之路:用js给选中文字添加样式

    前言 本例基于react,但是实际上就是用原生js做的.兼容性做到了IE9,但是按照这个思路做是可以做到IE8甚至更低的. 需求与最初的思路 当我拿到这个需求的时候以为很简单,就是可以给页面上的文章做 ...

  9. 使用go mod结合docker分层缓存进行自动CI/CD

    本文地址:https://www.cnblogs.com/likeli/p/10521941.html 喜大奔的go mod 官方背书的go mod拯救了我的代码洁癖症! 环境 go v1.12 do ...

  10. IntelliJ IDE 常用配置

    一. Intellij IDE 安装与破解 详细安装步骤 二.IntelliJ Maven 配置 查看: 使用IntelliJ IDEA 配置Maven(入门) 三.IntelliJ Tomcat 配 ...