使用前提
在scrapy-redis 分布式采集中,往往会存在一些耗时操作,而这些耗时操作的响应时间长的话,会造成堵塞,使得scrapy-redis爬虫变成同步,不能真正的做到异步,从而影响采集时间
个人案例
在一次使用scrapy-redis下载视频,并将视频上传到ceph中,由于视频文件大,数据量多(大约日3000W个视频),上传ceph慢,使用同步上传,每个视频上传ceph大约2-3s,这样会浪费大量的时间在等待上传。因此想到使用异步的方法,避免造成大量的等待。
S3FilesStore
scrapy 自带的ceph上传的库,经过分析persist_file方法是上传文件的地方,这个方法使用Twisted的threads.deferToThread,这个方法最后返回一个对象。
在下载中间键中使用
yield仅仅起到中断作用
当不使用defer.inlineCallbacks时,程序会无视 yield,直接执行下一行代码。
使用defer.inlineCallbacks时,会在此处挂起,等待执行完毕后才会走到下一行代码。