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中的hashlib和base64加密模块使用实例
Sep 02 Python
Python正则简单实例分析
Mar 21 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
python字符串循环左移
Mar 08 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
Pytorch 实现权重初始化
Dec 31 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
查看keras各种网络结构各层的名字方式
Jun 11 Python
Python 如何反方向迭代一个序列
Jul 28 Python
python中类与对象之间的关系详解
Dec 16 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截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
php文件上传类的分享
2017/07/06 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
python基础教程之缩进介绍
2014/08/29 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
Python程序中设置HTTP代理
2016/11/06 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Python新手学习标准库模块命名
2020/05/29 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
专科毕业生学习生活的自我评价
2013/10/26 职场文书
个人借款担保书
2014/04/02 职场文书
对孩子的寄语
2014/04/09 职场文书
妇女干部培训方案
2014/05/12 职场文书
信息管理专业自荐书
2014/06/05 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
python 调用js的四种方式
2021/04/11 Python
MySql开发之自动同步表结构
2021/05/28 MySQL
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python