zoukankan      html  css  js  c++  java
  • scrapy机制mark(基于twisted)

    twisted

    twisted管理了所有的异步任务

    Twisted的主线程是单线程的,即reactor线程;

    而这些io耗时操作会在线程池中运行,不再twisted主线程中运行,即通过线程池来执行异步任务

    即twisted通过事件循环(reactor)+线程池来实现异步 IO 的效果

    线程池大小默认是10,即这就是异步任务们的瓶颈


    scarpy业务代码

    scrapy是基于twisted的异步IO框架

    我们自己的scrapy业务代码也是单线程的

    (而scrapy的多线程是用来做一些与主流程无关的事,信号监听之类的)


    scarpy业务代码与twisted

    我们的scrapy业务代码和twisted代码是独立的

    通过回调函数来实现交互

    我们的代码与Twisted代码运行在同一个进程中,只能同时有一个在运行

    即通过分配时间片来交替执行,这样不会堵塞我们的逻辑代码


    总结:

    scarpy业务代码将任务交给twisted,twisted交给线程池

    具体:逻辑代码调用异步任务,立刻返回deferred,主线程接着向下走,任务交给twisted线程池,任务结束后,会去自动触发Deferred的回调操作

    我们要做的,就是添加这个回调逻辑

    CONCURRENT_REQUESTS只是传给 Twisted 的 Deferred 对象数量,就是可以返回多少个deferred,而deferred是依赖于线程池

    scarpy是单线程的,但任务实现了多线程;又python解释器有GIL,所以本质还是单线程的

  • 相关阅读:
    Poj3295 tautology
    Poj2586 每五个月都是亏
    Poj 2109 k^n = p.
    Poj2109 (2) k^n = p.
    Poj2109 (1) k^n = p.
    Poj2965 冰箱的开关
    Poj1328 用雷达覆盖所有的岛屿
    FASTER-RCNN
    卷积、池化计算
    理论感受野的计算
  • 原文地址:https://www.cnblogs.com/justaman/p/11491255.html
Copyright © 2011-2022 走看看