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列表去重的二种方法
Feb 14 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
深入解析Python中的WSGI接口
May 11 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
Python操作MySQL数据库的三种方法总结
Jan 30 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
创建Django项目图文实例详解
Jun 06 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
浅析python连接数据库的重要事项
Feb 22 Python
Python深度学习之Pytorch初步使用
May 20 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
论坛头像随机变换代码
2006/10/09 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
python reduce 函数使用详解
2017/12/05 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
Python通过字典映射函数实现switch
2020/11/06 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
高考自主招生自荐信
2013/10/20 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
会计人员岗位职责
2015/02/03 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript