如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

2024-04-26

我需要在Scrapy中运行一些多线程\多处理工作(因为我有一些使用阻塞调用的库),并在完成后将请求放回Scrapy引擎。

我需要这样的东西:

def blocking_call(self, html):
    # ....
    # do some work in blocking call
    return Request(url)

def parse(self, response):
    return self.blocking_call(response.body)

我怎样才能做到这一点?我想我应该使用 Twistedreactor 和 Deferred 对象。 但是 Scrapyparse回调必须仅返回None or Request or BaseItem object.


根据@Jean-Paul Calderone 的回答,我做了一些调查和测试,以下是我发现的内容。

scrapy内部使用Twisted https://twistedmatrix.com/trac/用于管理请求/响应同步和异步调用的框架。

Scrapy 产生requests(爬行)在async方式,但处理回应(我们的自定义解析回调函数)已完成同步。所以如果你在回调中有阻塞调用,它会阻塞整个引擎.

希望这可以改变。加工时Deferred https://twistedmatrix.com/documents/14.0.1/core/howto/gendefer.html#what-deferreds-don-t-do-make-your-code-asynchronous响应回调结果,Twisted处理案例(twisted.internet.defer.延迟源) https://twistedmatrix.com/trac/browser/trunk/twisted/internet/defer.py#L603 if Deferred对象返回其他Deferred目的。在这种情况下,Twisted 会产生新的异步调用。

基本上,如果我们回来Deferred https://twistedmatrix.com/documents/14.0.1/core/howto/gendefer.html#what-deferreds-don-t-do-make-your-code-asynchronous来自我们的响应回调的对象,这将改变响应回调调用的性质从同步到异步。为此我们可以使用方法推迟到线程 https://twistedmatrix.com/documents/14.0.1/core/howto/gendefer.html#integrating-blocking-code-with-twisted ( 内部调用 https://twistedmatrix.com/trac/browser/trunk/twisted/internet/threads.py#L58 deferToThreadPool(reactor, reactor.getThreadPool()...- 用于@Jean-Paul Calderone 代码示例)。

工作代码示例是:

from twisted.internet.threads import deferToThread
from twisted.internet import reactor

class SpiderWithBlocking(...):
    ...
    def parse(self, response):
        return deferToThread(reactor, self.blocking_call, response.body)

    def blocking_call(self, html):
        # ....
        # do some work in blocking call
        return Request(url)

此外,只有回调可以返回 Deferred 对象,但是start_requests不能(抓取逻辑)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用? 的相关文章

随机推荐

  • 当更新可用时,手动安装的 apk(不是从 Play 商店)会收到通知吗?

    我想在平板电脑上安装 apk 知道怎么做 我的平板电脑会收到来自 Play 商店的通知吗 该更新已在 Play 商店中准备就绪 我应该安装它吗 仅当满足以下两个条件时 您才会收到更新 在 Google Play 已安装的应用程序 选项卡中看
  • Flash 影片的 Div Z-Index 问题

    我有两个简单的 HTML div 一个包含 flash 电影 另一个 div 包含简单文本 现在我的问题是我必须将文本 div 放到 flash 电影 div 上 我正在做的是将两个 div 的位置设置为 CSS 中的 Absolute 并
  • 如何为 SonarQube 扫描配置 Jenkins 管道

    我正在尝试为我的项目配置詹金斯管道 但这里缺少一些东西 如果有人可以指出我做错了什么 下面是管道脚本 node stage SonarQube analysis requires SonarQube Scanner 2 8 def scan
  • 协议缓冲区和 UTF-8

    编码方案 多操作系统和 Endian nes 的历史导致了对所有形式的字符串数据 即所有字母表 进行编码方面的混乱 因此 协议缓冲区仅处理其字符串类型中的 ASCII 或 UTF 8 并且我看不到任何接受 C wstring 的多态重载 那
  • 出现错误:User 类型的对象在 django python 中不可 JSON 序列化

    我是 django python 的新手 当我尝试从 3 个表获取数据时 出现错误Object of type User is not JSON serializable 任何人都可以帮我解释为什么我会收到此错误吗 在这里我添加了我的vie
  • 关于指针的c/c++问题(双指针)

    自从我学习 c 和 c 课程以来已经有一段时间了 我对 c 指针很好奇 我将在我的示例中使用 new 关键字 即使我知道 malloc 是 C 方式 我总是记得我的老师总是强迫我们使用指针 她永远不会接受数组的作业 她向我们证明 当您使用指
  • 使用页内 JSON 初始化 AngularJS $resource

    我正在使用 AngularJS 的 resource 来获取和更新对象 为了节省页面加载时的往返 我将 JSON 对象放在页面上的变量中 如何使用此数据初始化 resource 而不是调用 get 您可以使用new创建使用以下命令创建的资源
  • 在 asp.net mvc url 中格式化查询字符串的最佳方法?

    我注意到 如果您通过 asp net mvc 发送查询字符串路由值 您最终会将所有空格编码为 20 因为我希望将空格转换为 号 所以覆盖此格式的最佳方法是什么 我正在考虑也许使用自定义 Route 对象或派生自 IRouteHandler
  • 设计具有多个 id 的 RESTful 服务

    我正在设计一个 RESTful 服务 就是列出一组数据 主要问题是该集合没有合理的单一标识符 在系统的知识范围内也不能轻易地计算出特定的集合 因此 似乎不可能有 GET items identifier 服务 我确实有所请求的每个元素的 i
  • 融合表查询

    我有一个非常大的融合表 现在 我想根据用户需求进行查询 我的用户界面应该有一个下拉框来选择列的名称 另一个下拉框用于选择查询条件 gt user1225902 您需要在页面加载期间调用onLoad函数 我有同样的问题
  • 休息。球衣。如何以编程方式选择返回类型:JSON 或 XML?

    我有两个问题 1 我可以创建吗one类 使用 JAXB 注释对其进行注释 用于 XML 支持 并在中声明web xml
  • 为什么 Visual Studio 2008 中删除了在新 ATL 项目中使用属性的选项?

    这是来自 MSDN 评论的文本 根据 ATL Internals 2ed 一书 属性的使用已被弃用 不应在新的 ATL 项目中使用 但为什么 在 ATL 中 这些属性是编译器的技巧 它们不像 C 中的属性那样是平台的核心部分 它们的调试也比
  • 如何循环线程句柄并在完成后加入另一个循环?

    我有一个程序 它在循环中创建线程 并检查它们是否已完成并清理它们 如果已完成 请参阅下面的最小示例 use std thread fn main let mut v Vec
  • 使用比较器对映射进行排序

    我想Comparator实现排序TreeMap按照顺序 final String sequence People Object Environment Message Service Comparator
  • AT 命令 PHP

    我想使用 GSM 调制解调器从 php 发送消息 我已经配置了调制解调器并使用超级终端对其进行了测试 现在我想使用php执行AT命令 是否有可用的开源库或其他解决方案 由于我的 php 应用程序托管在 Apache Web 服务器上 因此我
  • 网页配置。使用规则元素将所有流量重定向到 www.my...。

    我有一个 web config 文件 它自动将流量发送到 HTTPS 但是 如果有人进入 MyDomain com 那么它将转到https mydomain com https mydomain com如果有人输入 www mydomain
  • Android - 检查数组中是否存在某个值

    我有一个名为 bob 的数组 其中包含值 String bob this is a really silly list 我如何知道名为 bob 的数组中是否存在 愚蠢 值而不迭代它 您可以使用List contains http docs
  • 在 VS Code 中折叠一行时,是否可以覆盖缩进并选择该折叠中包含哪些行?

    是否可以自定义 Visual Studio Code 中代码折叠的工作方式 我使用一种通用模式来定义各种不同文档类型的代码区域 因此 对于 XML 我将文本部分包裹起来 and 对于 c 我使用 region to endregion 对于
  • 如何在C#中捕获键盘上的按键

    我有个问题 我需要写一个C 程序 输入 允许用户输入多行文本 按 Ctrl Enter 完成输入 输出 标准化 按照时间增加的正确顺序重新排列行 我尝试过 但我不知道如何从键盘捕获 Ctrl Enter 我期望输出像 例子 Created
  • 如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

    我需要在Scrapy中运行一些多线程 多处理工作 因为我有一些使用阻塞调用的库 并在完成后将请求放回Scrapy引擎 我需要这样的东西 def blocking call self html do some work in blocking