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中模拟enum枚举类型的5种方法分享
Nov 22 Python
Python脚本实时处理log文件的方法
Nov 21 Python
Python 将pdf转成图片的方法
Apr 23 Python
详解Python locals()的陷阱
Mar 26 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
python怎么自定义捕获错误
Jun 29 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
python动态规划算法实例详解
Nov 22 Python
Python wordcloud库安装方法总结
Dec 31 Python
python flask框架快速入门
May 14 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中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
PHP基于IMAP收取邮件的方法示例
2017/08/07 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
python 实现让字典的value 成为列表
2019/12/16 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
车间统计员岗位职责
2014/01/05 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
科技之星事迹材料
2014/06/02 职场文书
文明好少年事迹材料
2014/08/19 职场文书
群教班子对照检查材料
2014/08/26 职场文书
指导老师鉴定意见
2015/06/05 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
python实现语音常用度量方法的代码详解
2021/05/25 Python
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏