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实现ftp客户端示例分享
Feb 17 Python
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
python 系统调用的实例详解
Jul 11 Python
简单谈谈Python中的json与pickle
Jul 19 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
Django的models中on_delete参数详解
Jul 16 Python
python3实现单目标粒子群算法
Nov 14 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
人工智能深度学习OpenAI baselines的使用方法
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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
一个程序下载的管理程序(一)
2006/10/09 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python实现定时播放mp3
2015/03/29 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python list转矩阵的实例讲解
2018/08/04 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
python实现单机五子棋
2020/08/28 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
学年末自我鉴定
2014/01/21 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
总结几个非常实用的Python库
2021/06/26 Python
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL