python3爬虫GIL修改多线程实例讲解


Posted in Python onNovember 24, 2020

我们打开程序后,会发现电脑的内存和cpu发生了变化。在对于前者上面,自然是希望内容占用小,cpu的利用越高越好。那有没有什么方法可以让我们的cpu达到满状态的运行效果呢?这就得用到我们所学的多线程中的知识了,再正式开始讲解之前,我们先来说说操作的思路吧,然后进行代码对比。

我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。我们不妨做个试验:

#coding=utf-8
from multiprocessing import Pool
from threading import Thread
from multiprocessing import Process
def loop():
  while True:
    pass
if __name__ == '__main__':
  for i in range(3):
    t = Thread(target=loop)
    t.start()
  while True:
    pass

我的电脑是4核,所以我开了4个线程,看一下CPU资源占有率:

python3爬虫GIL修改多线程实例讲解 

我们发现CPU利用率并没有占满,大致相当于单核水平。

而如果我们变成进程呢?

我们改一下代码:

#coding=utf-8
from multiprocessing import Pool
from threading import Thread
from multiprocessing import Process
def loop():
  while True:
    pass
if __name__ == '__main__':
  for i in range(3):
    t = Process(target=loop)
    t.start()
    Pass

python3爬虫GIL修改多线程实例讲解

结果直接飙到了100%,说明进程是可以利用多核的!

以上就是python3爬虫GIL修改多线程实例讲解的详细内容,更多关于python3爬虫中的GIL修改多线程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
利用python求相邻数的方法示例
Aug 18 Python
详解如何使用Python编写vim插件
Nov 28 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
Python分类测试代码实例汇总
Jul 23 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
Sep 01 Python
django有哪些好处和优点
Sep 01 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
Django URL参数Template反向解析
Nov 24 #Python
python3爬虫中引用Queue的实例讲解
Nov 24 #Python
python3爬虫中多线程的优势总结
Nov 24 #Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 #Python
python 如何停止一个死循环的线程
Nov 24 #Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 #Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 #Python
You might like
一个简单计数器的源代码
2006/10/09 PHP
PHP中的CMS的涵义
2007/03/11 PHP
php 在线打包_支持子目录
2008/06/28 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
初学JavaScript第二章
2008/09/30 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python 使用多属性来进行排序
2019/09/01 Python
如何基于python生成list的所有的子集
2019/11/11 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
Gap工厂店:Gap Factory
2017/11/02 全球购物
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
应届生自荐信
2014/06/30 职场文书
商场消防安全责任书
2014/07/29 职场文书
离婚协议书格式
2014/11/21 职场文书
新学期感想
2015/08/10 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
python自动化八大定位元素讲解
2021/07/09 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android