使用py-spy解決scrapy卡死的問題方法
背景
在使用scrapy爬取東西的時(shí)候,使用crontab定時(shí)的啟動(dòng)爬蟲,但是發(fā)現(xiàn)機(jī)器上經(jīng)常產(chǎn)生很多卡死的scrapy進(jìn)程,一段時(shí)間不管的話,會(huì)導(dǎo)致有10幾個(gè)進(jìn)程都卡死在那,并且會(huì)導(dǎo)致數(shù)據(jù)產(chǎn)出延遲。
問題定位
使用py-spy這個(gè)非常好用的python性能分析工具來進(jìn)行排查,py-spy可以查看一個(gè)python進(jìn)程函數(shù)調(diào)用用時(shí),類似unix下的top命令。所以我們用這個(gè)工具看看是什么函數(shù)一直在執(zhí)行。
首先安裝這個(gè)工具
pip install py-spy
用py-spy看看scrapy哪個(gè)函數(shù)執(zhí)行時(shí)間長(zhǎng)
# 先找到這個(gè)卡死的scrapy進(jìn)程的pid ps -ef |grep scrapy # 啟動(dòng) py-spy 觀察這進(jìn)程 py-spy top --pid 53424
首先我們按3,按OwnTime進(jìn)行排序,這個(gè)表示函數(shù)自身執(zhí)行的時(shí)間,可以看到read這個(gè)函數(shù)執(zhí)行的時(shí)間最長(zhǎng),那看來是IO導(dǎo)致的,程序中的IO行為就是讀寫磁盤和網(wǎng)絡(luò)IO,磁盤讀寫一般不會(huì)有問題,所以初步定位是網(wǎng)絡(luò)IO導(dǎo)致的。
接下來進(jìn)行進(jìn)一步確認(rèn),再按4,按TotalTIme 所有子函數(shù)執(zhí)行時(shí)間總和進(jìn)行排序,可以看到是在process_item和download,upload_image這些主流程函數(shù)的執(zhí)行時(shí)間比較長(zhǎng),這一步是先把圖片下載到本地,然后上傳到靜床,看來是下載這步從網(wǎng)絡(luò)中read數(shù)據(jù)時(shí)出現(xiàn)了問題,進(jìn)一步追蹤代碼。
看下download的函數(shù)的代碼:
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這個(gè)庫(kù)里面request.urlretrieve函數(shù),這個(gè)函數(shù)是用來下載文件的,去看看python官網(wǎng)文檔的函數(shù)說明,發(fā)現(xiàn)里面沒有超時(shí)時(shí)間這個(gè)參數(shù),所以是由于沒有超時(shí)時(shí)間,導(dǎo)致一直在read,進(jìn)而使得進(jìn)程卡死。
urllib.request.urlretrieve(url, filename=None,reporthook=None,data=None)
解決方案
使用另一種方式來下載圖片,使用支持超時(shí)時(shí)間的urlopen函數(shù),封裝成一個(gè)自定義的url_retrieve,這樣就不再會(huì)出現(xiàn)沒有超時(shí)導(dǎo)致的卡死問題了。
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
到此這篇關(guān)于使用py-spy解決scrapy卡死的問題方法的文章就介紹到這了,更多相關(guān)scrapy卡死內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python常用模塊(math itertools functools sys
這篇文章主要介紹了python常用模塊之math itertools functools sys shutil的使用示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06對(duì)pandas數(shù)據(jù)判斷是否為NaN值的方法詳解
今天小編就為大家分享一篇對(duì)pandas數(shù)據(jù)判斷是否為NaN值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則
這篇文章主要介紹了總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則,本文講解了每個(gè)函數(shù)只做一件事、保持簡(jiǎn)單、保持簡(jiǎn)短、輸入使用參數(shù)、輸出使用return語句等內(nèi)容,需要的朋友可以參考下2015-06-06python實(shí)現(xiàn)二級(jí)登陸菜單及安裝過程
這篇文章主要介紹了python實(shí)現(xiàn)二級(jí)登陸菜單及安裝過程,,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06Python?Flask框架實(shí)現(xiàn)小紅書圖片無水印解析下載
這篇文章主要為大家介紹了Python?Flask框架實(shí)現(xiàn)小紅書圖片無水印解析下載,需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Python selenium的安裝和下載谷歌瀏覽器鏡像驅(qū)動(dòng)
Selenium是一個(gè)用于web自動(dòng)化測(cè)試的框架,在使用Ajax請(qǐng)求數(shù)據(jù)的頁(yè)面中,會(huì)出現(xiàn) sign ,token等密鑰,借助使用Selenium框架來實(shí)現(xiàn)數(shù)據(jù)爬取很不錯(cuò),本文給大家介紹Python selenium的安裝和下載谷歌瀏覽器鏡像驅(qū)動(dòng),需要的朋友可以參考下2022-11-11python實(shí)現(xiàn)與redis交互操作詳解
這篇文章主要介紹了python實(shí)現(xiàn)與redis交互操作,結(jié)合實(shí)例形式分析了Python Redis模塊的安裝、導(dǎo)入、連接與簡(jiǎn)單操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-04-04利用Django提供的ModelForm增刪改數(shù)據(jù)的方法
這篇文章主要介紹了利用Django提供的ModelForm增刪改數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01