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 相关文章推荐
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 Python
Python入门篇之字典
Oct 17 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Django实现单用户登录的方法示例
Mar 28 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
Python 控制终端输出文字的实例
Jul 12 Python
Python读取表格类型文件代码实例
Feb 17 Python
Python实现SMTP邮件发送
Jun 16 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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 命名空间实例说明
2011/01/27 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
python一键升级所有pip package的方法
2017/01/16 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python
python在package下继续嵌套一个package
2022/04/14 Python