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 相关文章推荐
举例详解Python中yield生成器的用法
Aug 05 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python中flatten( )函数及函数用法详解
Nov 02 Python
python实现求特征选择的信息增益
Dec 18 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
python访问hdfs的操作
Jun 06 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 Python
python文件名批量重命名脚本实例代码
Apr 22 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
在JavaScript中调用php程序
2009/03/09 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
php简单分页类实现方法
2015/02/26 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
js实现无缝滚动图
2017/02/22 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
酒店保洁主管岗位职责
2013/11/28 职场文书
求职简历的自我评价
2014/01/31 职场文书
保护环境建议书300字
2014/05/13 职场文书
民主生活会剖析材料
2014/09/30 职场文书
市级三好学生评语
2014/12/29 职场文书
校运会广播稿
2015/08/19 职场文书
python urllib库的使用详解
2021/04/13 Python
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis