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线程锁(thread)学习示例
Dec 04 Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 Python
在Python中用get()方法获取字典键值的教程
May 21 Python
python根据京东商品url获取产品价格
Aug 09 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
对python append 与浅拷贝的实例讲解
May 04 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
python远程连接MySQL数据库
Apr 19 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
Python连接Impala实现步骤解析
Aug 04 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 strrpos()与strripos()函数
2013/08/31 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python numpy中cumsum的用法详解
2019/10/17 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
python3实现单目标粒子群算法
2019/11/14 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
EJB与JAVA BEAN的区别
2016/08/29 面试题
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
前台接待员岗位职责
2014/01/02 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
幼儿园开学通知
2015/04/24 职场文书
工作失职检讨书范文
2015/05/05 职场文书
新店开张宣传语
2015/07/13 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS