使用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实现读取文件最后n行的方法
Feb 23 Python
python入门教程之识别验证码
Mar 04 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
Python内置random模块生成随机数的方法
May 31 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 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 each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
js实现楼层导航功能
2017/02/23 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
Python threading多线程编程实例
2014/09/18 Python
Python中文件的读取和写入操作
2018/04/27 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python能开发游戏吗
2020/06/11 Python
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
有针对性的求职自荐信
2013/11/14 职场文书
食品安全工作方案
2014/05/07 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
个人年度总结报告
2015/03/09 职场文书
调解协议书范本
2016/03/21 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python
python 中的jieba分词库
2021/11/23 Python
python 判断文件或文件夹是否存在
2022/03/18 Python