使用py-spy解决scrapy卡死的问题方法


Posted in Python onSeptember 29, 2020

背景

在使用scrapy爬取东西的时候,使用crontab定时的启动爬虫,但是发现机器上经常产生很多卡死的scrapy进程,一段时间不管的话,会导致有10几个进程都卡死在那,并且会导致数据产出延迟。

问题定位

使用py-spy这个非常好用的python性能分析工具来进行排查,py-spy可以查看一个python进程函数调用用时,类似unix下的top命令。所以我们用这个工具看看是什么函数一直在执行。

首先安装这个工具

pip install py-spy

用py-spy看看scrapy哪个函数执行时间长

# 先找到这个卡死的scrapy进程的pid
ps -ef |grep scrapy 
# 启动 py-spy 观察这进程
py-spy top --pid 53424

首先我们按3,按OwnTime进行排序,这个表示函数自身执行的时间,可以看到read这个函数执行的时间最长,那看来是IO导致的,程序中的IO行为就是读写磁盘和网络IO,磁盘读写一般不会有问题,所以初步定位是网络IO导致的。

使用py-spy解决scrapy卡死的问题方法

接下来进行进一步确认,再按4,按TotalTIme 所有子函数执行时间总和进行排序,可以看到是在process_item和download,upload_image这些主流程函数的执行时间比较长,这一步是先把图片下载到本地,然后上传到静床,看来是下载这步从网络中read数据时出现了问题,进一步追踪代码。

使用py-spy解决scrapy卡死的问题方法

看下download的函数的代码:

if filename == '':
      filename = os.path.basename(url)
    path = path + '/' + filename
    
    try:
      res = request.urlretrieve(url,filename=path)
      print(url,res)
      return path
    except Exception as e:
      print('download img failed')
      print(e)
      return False

可以看到用了urllib这个库里面request.urlretrieve函数,这个函数是用来下载文件的,去看看python官网文档的函数说明,发现里面没有超时时间这个参数,所以是由于没有超时时间,导致一直在read,进而使得进程卡死。

urllib.request.urlretrieve(url, filename=None,reporthook=None,data=None)

解决方案

使用另一种方式来下载图片,使用支持超时时间的urlopen函数,封装成一个自定义的url_retrieve,这样就不再会出现没有超时导致的卡死问题了。

def url_retrieve(self,url, path):
    r = request.urlopen(url, timeout=5)
    res = False
    with open(path,"wb") as f:
      res = f.write(r.read())
      f.flush()
      f.close()
    return res

到此这篇关于使用py-spy解决scrapy卡死的问题方法的文章就介绍到这了,更多相关scrapy卡死内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python制作简易注册登录系统
Dec 15 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
python Celery定时任务的示例
Mar 13 Python
基于python requests库中的代理实例讲解
May 07 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
Python3标准库之functools管理函数的工具详解
Feb 27 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
python 爬取吉首大学网站成绩单
Jun 02 Python
详解python对象之间的交互
Sep 29 #Python
python PIL模块的基本使用
Sep 29 #Python
Python 如何实现数据库表结构同步
Sep 29 #Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 #Python
python ssh 执行shell命令的示例
Sep 29 #Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 #Python
浅析python 字典嵌套
Sep 29 #Python
You might like
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
php中如何执行linux命令详解
2018/11/06 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
Python的Django框架中的表单处理示例
2015/07/17 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
python设置环境变量的作用和实例
2019/07/09 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
python ftplib模块使用代码实例
2019/12/31 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
如何查找网页漏洞
2016/06/22 面试题
怎样写好自荐信和推荐信
2013/12/26 职场文书
可口可乐广告词
2014/03/20 职场文书
小学生演讲稿大全
2014/04/25 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
全陪导游词
2015/02/04 职场文书
2016年国培研修日志
2015/11/13 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电