使用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中生成器和yield语句的用法详解
Apr 17 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
Jul 02 Python
Java分治归并排序算法实例详解
Dec 12 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
django迁移数据库错误问题解决
Jul 29 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
tensorflow 变长序列存储实例
Jan 20 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Python下载的11种姿势(小结)
Nov 18 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 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乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
PHP 代码规范小结
2012/03/08 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
Angular通过指令动态添加组件问题
2018/07/09 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
python的常见命令注入威胁
2013/02/18 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
Python如何实现机器人聊天
2020/09/10 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
汉语专业应届生求职信
2013/10/01 职场文书
大学生大二自我鉴定
2013/10/28 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
陕西导游词
2015/02/04 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
如何利用pygame实现打飞机小游戏
2021/05/30 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
python_tkinter弹出对话框创建
2022/03/20 Python