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中xrange和range的区别
May 13 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
python如何使用unittest测试接口
Apr 04 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
启动Atom并运行python文件的步骤
Nov 09 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
深入浅析Python中的迭代器
Jun 04 Python
python 数据类型强制转换的总结
Jan 25 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开发大型项目的一点经验
2006/10/09 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
完美解决js传递参数中加号和&号自动改变的方法
2016/10/11 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
python数值基础知识浅析
2019/11/19 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
数据员岗位职责
2013/11/19 职场文书
小班上学期评语
2014/05/05 职场文书
2014年中秋寄语
2014/08/11 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers