请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于scrapy数据库异步操作

老师你好,请教两个关于scrapy的问题:1)yield 多个scrapy.Request出去,callback指向同一个函数,在callback函数中time.sleep, 会不会阻塞别的request的callback处理? 我调试的结果:看起来会阻塞

2)yield 几十上百个scrapy.Request出去, 所有request的callback里提取页面内容将item yield出去后退出。pipeline中用adbapi异步写数据库,但是异步数据库操作会随着callback跑完退出、spider关闭 而终止,异步数据操作写不完 上面两个问题好像相互矛盾:要等异步数据库操作完成,就得让spider不退出,要让spider不退出,就得让最后一个request的callback不退出或延时退出,但延时又会阻塞其它的request的处理。请解答,谢谢

正在回答 回答被采纳积分+3

1回答

bobby 2019-11-28 18:25:25
  1. 确实会的,这个我也强调过在scrapy中不要用同步的方法

  2. adbapi的好处就是可以快速的将请求发送出去,也就是快速的交给mysql去处理

    整个scrapy的处理是单线程的,因为底层依赖的是twisted,所以不论是入库还是继续请求url都是在一个线程中,也就是按顺序执行的,这个也就是为什么在pipeline中不建议使用同步的方式入库的原因

0 回复 有任何疑惑可以回复我~
  • 提问者 慕婉清4097246 #1
    老师,可不可以这样理解:即使在callback中用一个for循环yield了多个后续的url请求出去,这些后续的url请求的callback也是同步执行的?
    回复 有任何疑惑可以回复我~ 2019-11-29 20:58:38
  • bobby 回复 提问者 慕婉清4097246 #2
    url的下载不是同步,也是异步的,也就是即使是一个线程,你随时yield出去的request也可以被立马把请求发送出去而不用等到响应返回
    回复 有任何疑惑可以回复我~ 2019-12-01 13:22:29
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信