python爬虫之多线程、多进程、GIL锁
背景:
我们知道多线程要比多进程效率更高,因为线程存在于进程之内,打开一个进程的话,首先需要开辟内存空间,占用内存空间比线程大。这样想也不怪,比如一个进程用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锁的更多相关文章
- python爬虫之多线程、多进程+代码示例
python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...
- python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型
线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...
- Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍 本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使 ...
- Python爬虫之多线程
详情点我跳转 关注公众号"轻松学编程"了解更多. 多线程 在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全 ...
- Python爬虫之多线程下载程序类电子书
近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下: 那么我们是否可以通过Py ...
- Python爬虫进阶 | 多线程
一.简介 为了提高爬虫程序效率,由于python解释器GIL,导致同一进程中即使有多个线程,实际上也只会有一个线程在运行,但通过request.get发送请求获取响应时有阻塞,所以采用了多线程依然可以 ...
- python学习之多线程多进程
python基础 进程&线程 进程是一组资源的集合,运行一个系统就是打开了一个进程,如果同时打开了两个记事本就是开启了两个进程,进程是一个笼统的概念,进程中由线程干活工作,由进程统一管理 一个 ...
- 爬虫之多线程 多进程 自定义异步IO框架
什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...
- 【新手必学】Python爬虫之多线程实战
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:清风化煞_ 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
随机推荐
- ubuntu18.04 下 使用conda安装requirement.txt指定的依赖包
首先创建特定的虚拟环境 conda create -n temp_test python=3.5 conda install anaconda 切换到该环境 conda activate temp_t ...
- P2370 yyy2015c01的U盘(二分+背包)
思路:先说一下题意吧.就是给你n个文件大小为v,价值为c, 但是硬盘的大小为S, 而且要存的总价值大于等于p.问每次传输k大小的文件.问k的最大值是多少? 我们以k为二分对象. 直接讲检验函数吧. 假 ...
- 【转】理解WebKit和Chromium: JavaScript引擎简介
转载请注明原文地址:http://blog.csdn.net/milado_nju1. 什么是JavaScript引擎什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript代码 ...
- github上传超过100mb文件怎么办
使用Git LFS 上传.Git lFS(Git Large File Storage) 可以上传超过100MB的文件,使用方式为: 下载安装Git LFS 打开git cmd 中间输入 账号和密码 ...
- mysql 性能优化思路 - mysqldumpslow /tmp/mysql-slow.log 字符集 utf-8 create database
提高MySQL服务的性能,响应速度: 1.替换有问题的硬件:内存,CPU,磁盘 2.服务的配置参数的配置 3.SQL的优化 .服务参数的配置: 1.1 连接数,连接超时: max_connection ...
- Luogu P3703 [SDOI2017]树点涂色
比较有趣的综合树上问题,刷LCT题单时做的但是发现后面LCT只是起了辅助作用233 首先我们分析每一个操作,\(1\)的定义就让我们联想到了access,我们回忆一下LCT的性质: LCT中每一个sp ...
- 探讨.NET Core数据进行3DES加密和解密问题
前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...
- Webpack+Typescript 简易配置
教程:https://www.cnblogs.com/yasepix/p/9294499.html http://developer.egret.com/cn/github/egret-docs/ex ...
- 简单的将Excel数据同步到SqlServer数据库中
1.创建一个WinForm程序,添加一个Button控件 2.Button事件 private void button1_Click(object sender, EventArgs e) { Sys ...
- python线程中的全局变量与局部变量
在python多线程开发中,全局变量是多个线程共享的数据,局部变量是各自线程的,非共享的. 如下几种写法都是可以的: 第一种:将列表当成参数传递给线程 from threading import Th ...