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连接数据库学习之DB-API详解
Feb 07 Python
Python中元组,列表,字典的区别
May 21 Python
Python的装饰器使用详解
Jun 26 Python
python与C互相调用的方法详解
Jul 14 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
Python登录注册验证功能实现
Jun 18 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 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
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
python3实现暴力穷举博客园密码
2016/06/19 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
Python global全局变量函数详解
2018/09/18 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
艺术专业大学生自我评价
2013/09/22 职场文书
初中生物教学反思
2014/01/10 职场文书
迟到检讨书400字
2014/01/13 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
个人存款证明书
2014/10/18 职场文书
追悼词范文大全
2015/06/23 职场文书
实践论读书笔记
2015/06/29 职场文书
军训结束新闻稿
2015/07/17 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript