并处理已安装其他 reactor 的冲突?)
Scrapy 如何切换 Twisted reactor如 EPollReactor并处理已安装其他 reactor 的冲突【免费下载链接】scrapyScrapy, a fast high-level web crawling scraping framework for Python.项目地址: https://gitcode.com/GitHub_Trending/sc/scrapy当 Scrapy 默认的 asyncio reactor 不适用于你的代码、或者默认 reactor 的某些限制例如 macOS 大规模爬取时的文件描述符问题影响运行时需要把 Scrapy 切换到另一个 Twisted reactor例如twisted.internet.epollreactor.EPollReactor。整个切换围绕TWISTED_REACTOR设置完成但有一个关键约束一旦某个 Twisted reactor 在进程中被安装运行时就不可能再切换到别的 reactor。如果你的代码或其他库抢先安装了 reactorScrapy 启动时会直接报错。本文说明切换步骤、冲突的判定与修复方式。reactor 的选择与安装机制先弄清默认行为才能判断该在哪里动手TWISTED_REACTOR的默认值是twisted.internet.asyncioreactor.AsyncioSelectorReactor即启用 asyncio 支持的 reactor见 scrapy/settings/default_settings.py。当调用scrapyCLI或使用CrawlerProcess/AsyncCrawlerProcess时如果此时还没有其他 reactor 被安装Scrapy 会按TWISTED_REACTOR设置的值安装 reactor。使用CrawlerRunner/AsyncCrawlerRunner时reactor 必须事先安装需要你用 scrapy.utils.reactor.install_reactor 手动安装。如果已有 reactor 安装install_reactor没有效果。一个进程只能使用一个 reactor因此 reactor 相关设置不能按 spider 分别取不同值只能使用第一个运行的 spider 的值后续 spider 若要求不同的 reactor 或事件循环会抛出异常。运行需要CrawlerProcess的命令时TWISTED_REACTOR同时充当 pre-crawler setting项目级值决定使用哪个 crawler process 类不能从 spider 的 per-spider settings 中设置。以上机制说明来自 docs/topics/settings.rst 的 Reactor settings 与TWISTED_REACTOR章节。切换到 EPollReactor 等 reactor 的操作步骤最短主路径通过 CLI 或CrawlerProcess运行在项目的settings.py中把TWISTED_REACTOR设为目标 reactor 的 import path# settings.py TWISTED_REACTOR twisted.internet.epollreactor.EPollReactor把它设为None则使用你平台的默认 reactor见 docs/topics/asyncio.rst 的 “Switching to a non-asyncio reactor” 章节。如果当前代码使用AsyncCrawlerRunner或AsyncCrawlerProcess需要同时切换到它们的 Deferred 版本CrawlerRunner/CrawlerProcess。注意AsyncCrawlerProcess在实例化时会固定安装AsyncioSelectorReactor忽略TWISTED_REACTOR的值之后若再传入不同的TWISTED_REACTOR值例如通过 per-spider settings会抛出异常。如果你使用CrawlerRunner在创建 crawler 前手动安装目标 reactorfrom scrapy.crawler import CrawlerRunner from scrapy.utils.reactor import install_reactor # 按 TWISTED_REACTOR 相同的 import path 安装目标 reactor install_reactor(twisted.internet.epollreactor.EPollReactor)install_reactor(reactor_path)按指定 import path 安装 reactor传None或不传则安装 asyncio reactor见 scrapy/utils/reactor.py。正常启动scrapy crawl my_spider一个切换的典型动机docs/faq.rst 提到在 macOS 上运行大规模爬取、且默认 Twisted reactor 是twisted.internet.selectreactor.SelectReactor时曾报告出现ValueError: filedescriptor out of range in select()。如果你之前已用TWISTED_REACTOR切换过 reactor按同样的方式切换到另一个即可。已安装其他 reactor 的冲突现象与修复现象你已按上文配置了 reactor但运行时 Scrapy 抱怨“已经安装了另一个 reactor”AsyncCrawlerRunner等类在已安装的 reactor 与TWISTED_REACTOR设置不匹配时也会抛出异常。源码中的校验函数verify_installed_reactor会抛出形如The installed reactor (...) does not match the requested one (...)的RuntimeError见 scrapy/utils/reactor.py。原因twisted.internet.reactor以及其他一些 Twisted 导入会以副作用安装默认的 Twisted reactor。reactor 一旦安装运行时不可能再切换。文档指出如果你在代码里存在模块级module-level的 Twisted 导入很可能就是冲突来源项目文件和所导入的第三方库顶层的twisted.internet.reactor导入都会导致 Scrapy 在检查已安装 reactor 时抛异常。修复方法一文档推荐把有问题的模块级 Twisted 导入移到实际使用它的方法或函数内部。文档给出的示例修改前from twisted.internet import reactor def my_function(): reactor.callLater(...)修改后def my_function(): from twisted.internet import reactor reactor.callLater(...)修复方法二在这些导入发生之前先用install_reactor手动安装你想要的 reactor。注意前提是“抢在导入之前”——如果此时 reactor 已经被安装install_reactor没有效果只能回到方法一处理导入顺序。验证与判断切换后按正常方式启动爬取。如果抛出RuntimeError且信息是“已安装 reactor 与请求的不匹配”说明有别的代码抢先安装了 reactor回到上一节检查模块级导入。使用CrawlerRunner/AsyncCrawlerRunner时reactor 必须事先安装这两个类只把TWISTED_REACTOR设置用来校验已安装的 reactor 是否匹配启动时通过校验、爬取正常进行即说明 reactor 检查已通过。如果你在排查 macOS 上的filedescriptor out of range in select()文档给出的判断路径就是确认当前默认 reactor 是否为SelectReactor然后按本文方式切换。边界与限制同一进程内的多个 spider 不能要求不同 reactorreactor 设置只取第一个运行 spider 的值之后不同值会触发异常。AsyncCrawlerProcess会忽略TWISTED_REACTOR要切换 reactor 应使用CrawlerProcess。如果你的目标不是“换一个 reactor”而是“完全不安装 reactor”那是另一个机制把TWISTED_REACTOR_ENABLED设为False2.15.0 引入当前为实验特性可能不适合生产使用此时TWISTED_REACTOR不生效。该模式会禁用 telnet console、FTP 下载器等功能默认 HTTP(S) 下载器换成AiohttpDownloadHandler详见 docs/topics/asyncio.rst 的 “Using Scrapy without a Twisted reactor” 章节。相关文档docs/topics/asyncio.rst、docs/topics/settings.rst、docs/faq.rst。【免费下载链接】scrapyScrapy, a fast high-level web crawling scraping framework for Python.项目地址: https://gitcode.com/GitHub_Trending/sc/scrapy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考