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标准算法实现数组全排列的方法
Mar 17 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
总结python中pass的作用
Feb 27 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python中比较两个列表的实例方法
Jul 04 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
Python中包的用法及安装
Feb 11 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
pytorch中index_select()的用法详解
Jan 06 Python
python解析json数据
Apr 29 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中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
详解AngularJS 过滤器的使用
2018/06/02 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
机械工程师求职自我评价
2013/09/23 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
企业职业病防治方案
2014/05/29 职场文书
关于保护环境的标语
2014/06/09 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
java版 简单三子棋游戏
2022/05/04 Java/Android