使用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监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python3中多线程编程的队列运作示例
Apr 16 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
python调试神器PySnooper的使用
Jul 03 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
python中count函数简单的实例讲解
Feb 06 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
基于python tkinter的点名小程序功能的实例代码
Aug 22 Python
Django项目创建及管理实现流程详解
Oct 13 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
社区(php&&mysql)五
2006/10/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
关于Python面向对象编程的知识点总结
2017/02/14 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
八年级音乐教学反思
2014/01/09 职场文书
推荐信模板
2014/05/09 职场文书
单位承诺书格式
2014/05/21 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
2014公司年终工作总结
2014/12/19 职场文书
党员个人年度总结
2015/02/14 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
保险公司增员口号
2015/12/25 职场文书
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫