背景:

  我们知道多线程要比多进程效率更高,因为线程存在于进程之内,打开一个进程的话,首先需要开辟内存空间,占用内存空间比线程大。这样想也不怪,比如一个进程用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. SQL LIKE 操作符

    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. SQL LIKE 操作符语法 SELECT colum ...

  2. 数组长度为len,数组元素的范围是0到len-1,找出数组的重复元素

    public static int findDuplicate(int[] nums) { int len = nums.length; //注意这里的for循环写法,在交换元素后,i没有增加,还要继 ...

  3. [matlab] 3.矩阵

    matlab矩阵运算很强大 ,几乎所有涉及矩阵运算的命令都有. 事实上,matlab里面所有变量都是以矩阵的形式保存下来的.   %% >> x=[1:2.1:10] x = 1.0000 ...

  4. linux普通用户提权操作

    [root@test1 ~]# vim /etc/sudoers ## Allow root to run any commands anywhere root ALL=(ALL) ALLzhouyu ...

  5. pytorch visdom可视化工具学习—1—详细使用-2-plotting绘图

    3)plotting绘图 我们已经包装了几种常见的plot类型,以便轻松创建基本的可视化.这些可视化是由Plotly驱动的. Visdom支持下列API.由 Plotly 提供可视化支持. vis.s ...

  6. jenkins使用1----初始化设置

    ####一.基本设置 1.首先找到系统管理 2.再找到全局配置一把黄色的锁头 3.新增JDK.Maven等 别名随便 下面的值添加jdk在jenkins这台机器上的位置,如果没找到可以点击自动安装,并 ...

  7. list.remove操作注意点

    通过源码分析一下结果public class Test { public static void main(String[] args) { // test1(); // test2(); test3 ...

  8. 小技巧:改变 VS Code 工作区页面背景

    效果图: 步骤(一): 1.点击页面左上角 文件/首选项/设置 2.在搜索框中输入:background 如下图. 3.找到  Background: Custom Images    选项并点击在 ...

  9. anaconda新建虚拟环境安装各个依赖包

    深度学习的代码,好多都需要安装一些安装包,在服务器上安装需要权限就很麻烦.看到网上有说把这些安装包一个个下载下来上传到服务器再安装,心累,想想工程量就很大~~~ 这时候就可以在anaconda中新建虚 ...

  10. koa-convert源码分析

    koa-convert最主要的作用是:将koa1包中使用的Generator函数转换成Koa2中的async函数.更准确的说是将Generator函数转换成使用co包装成的Promise对象.然后执行 ...