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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python中super函数的用法
Nov 17 Python
Python中反射和描述器总结
Sep 23 Python
Python字符串的常见操作实例小结
Apr 08 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
python logging 日志的级别调整方式
Feb 21 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
如何在Python 游戏中模拟引力
Mar 27 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
Django实现聊天机器人
May 31 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
phpwind中的数据库操作类
2007/01/02 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
<script defer> defer 是什么意思
2009/05/10 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
javascript arguments使用示例
2014/12/16 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
js实现计算器功能
2020/08/10 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
Python完全新手教程
2007/02/08 Python
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
太空授课观后感
2015/06/17 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python