twisted的task之cooperator和scrapy的parallel()函数

本文是关于下载结果返回后调用item处理的过程实现研究。

从scrapy的结果处理说起

def handle_spider_output(self, result, request, response, spider):
    if not result:
        return defer_succeed(None)
    it = iter_errback(result,
self.handle_spider_error, request, response, spider)
    dfd = parallel(it,
self.concurrent_items,
                  
self._process_spidermw_output, request, response, spider)
    return dfd

result是deferred的返回结果,它是一个生成器,实质是spider中parse方法的返回。

iter_errback是一个包装,用于迭代异常时调用错误处理函数

def iter_errback(iterable, errback, *a, **kw):
    """Wraps
an iterable calling an errback if an error is caught while
    iterating it.
    """
   
it = iter(iterable)
    while True:
        try:
            yield next(it)
        except StopIteration:
            break
        except
:
            errback(failure.Failure(),
*a, **kw)

回到handle_spider_output,看一下parallel

# scrapy/utils/defer.py

def parallel(iterable, count, callable, *args,
**named):
    """Execute
a callable over the objects in the given iterable, in parallel,
    using no more than ``count``
concurrent calls.

Taken from:
http://jcalderone.livejournal.com/24285.html
    """
   
coop =
task.Cooperator()
    work = (callable(elem, *args,
**named) for elem in iterable)
    return defer.DeferredList([coop.coiterate(work)
for _ in range(count)])

它不是很好理解,

关于cooperator()功能见其它文档

要理解的有以下几点:

  1. coop.coiterate(work)返回的是一个deferred,如果给定的迭代器执行完成或异常,会触发这个deferred的回调;
  2. 再给这些返回的deferred加上一个包装deferredlist,意为当它们的回调都被触发后会触发deferredlist的回调;
  3. 对于deferredlist的中多个对象来说,它们意味着cooperator对象中的_task列表有多个worker,而这些worker所指向的迭代器是一致的,即传入的work,所以不存在混乱问题,但work中的每次迭代具体由哪个worker执行及执行顺序是无法保证的,所以work迭代出的执行片段应该具有原子性。

就执行结果而言,count实质上是爬虫的item并发数量限制,_process_spidermw_output实质上是调用itemmanager的process_item,也就是依次调用所有pipeline的process_item处理result迭代出的内容。

scrapy item处理----cooperator和parallel()函数的更多相关文章

  1. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...

  2. 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l  查看scrapy创建爬虫文件可用的母版 Available templates: ...

  3. 第十篇 scrapy item loader机制

    在我们执行scrapy爬取字段中,会有大量的和下面的代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制 def parse_detail(sel ...

  4. python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制

    这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...

  5. scrapy item

    item item定义了爬取的数据的model item的使用类似于dict 定义 在items.py中,继承scrapy.Item类,字段类型scrapy.Field() 实例化:(假设定义了一个名 ...

  6. [scrapy]Item Loders

    Items Items就是结构化数据的模块,相当于字典,比如定义一个{"title":"","author":""},i ...

  7. scrapy item pipeline

    item pipeline process_item(self, item, spider) #这个是所有pipeline都必须要有的方法在这个方法下再继续编辑具体怎么处理 另可以添加别的方法 ope ...

  8. 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL

    传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库, 这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦. 我 ...

  9. Item 17: 理解特殊成员函数的生成规则

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++9 ...

随机推荐

  1. C++-LUOGU2938- [USACO09FEB]股票市场Stock Market-[完全背包]

    开O2,开O2,开O2 重要的事情说三遍 #include <set> #include <map> #include <cmath> #include <q ...

  2. Servlet文件上传下载

    今天我们来学习Servlet文件上传下载 Servlet文件上传主要是使用了ServletInputStream读取流的方法,其读取方法与普通的文件流相同. 一.文件上传相关原理 第一步,构建一个up ...

  3. update_jz首项V5.0-Tutorial

    What's New: 增加了4个对话框,用于展示信息.归并条目.剔除条目 增加了可视化统计图形中每个科室(柱形)的统计总数 可视化图形一些颜色调整(无奈在省份很多的条件下一些颜色还不易区分) 下面是 ...

  4. Nginx可以做什么

    Nginx能做什么 ——反向代理 ——负载均衡 ——HTTP服务器(动静分离) ——正向代理 反向代理 反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(R ...

  5. P2141珠心算测验题解

    先来看一下题目:某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法.他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和? 这 ...

  6. HTTP状态码详解(下)

    接上文 HTTP状态码详解(上). 详细的描述状态码之(3**) 300:被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息.用户或浏览器能够自行选择一个首选的地址进 ...

  7. Abp.core中在应用层获取HttpContext对象

    实际IHttpContextAccessor对象已经在底层实现了自动的依赖注入,只需要在应用层引入Microsoft.AspNetCore.Http,然后在构造函数中依赖注入即可. /// <s ...

  8. Lenet 神经网络-实现篇(2)

    Lenet 神经网络在 Mnist 数据集上的实现,主要分为三个部分:前向传播过程(mnist_lenet5_forward.py).反向传播过程(mnist_lenet5_backword.py). ...

  9. DataTable、DataRow、DataColumn用法

    转载csdner 发布于2018-08-17 17:03:30 阅读数 4375  收藏   DataSet 表示数据在内存中的缓存. 属性 Tables  获取包含在 DataSet 中的表的集合. ...

  10. AcWing 861. 二分图的最大匹配 匈牙利算法

    #include <cstring> #include <iostream> #include <algorithm> using namespace std; , ...