使用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中处理字符串之isalpha()方法的使用
May 18 Python
pandas 转换成行列表进行读取与Nan处理的方法
Oct 30 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
详解Python3 pickle模块用法
Sep 16 Python
python生成器推导式用法简单示例
Oct 08 Python
基于python实现雪花算法过程详解
Nov 16 Python
python实现两个字典合并,两个list合并
Dec 02 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 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
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
再谈javascript面向对象编程
2012/03/18 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
python plotly画柱状图代码实例
2019/12/13 Python
Python chardet库识别编码原理解析
2020/02/18 Python
python右对齐的实例方法
2020/07/05 Python
django使用graphql的实例
2020/09/02 Python
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
三下乡个人总结
2015/03/04 职场文书
综合素质评价自我评价
2015/03/06 职场文书
Python如何识别银行卡卡号?
2021/06/10 Python
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS