使用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进行数据科学工作的简单入门教程
Apr 01 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
Python打印“菱形”星号代码方法
Feb 05 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
Apr 02 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
Python PyCharm如何进行断点调试
Jul 05 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
tensorflow 环境变量设置方式
Feb 06 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 Python
Python list列表删除元素的4种方法
Nov 01 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
半年思想汇报
2013/12/30 职场文书
银行委托书范本
2014/04/04 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
导游词范文
2015/02/13 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
python如何读取.mtx文件
2021/04/22 Python