在Scrapy的下载中间件中使用Deferred

5 投票
1 回答
995 浏览
提问于 2025-05-01 06:23

我打算在Scrapy的下载中间件中使用一些阻塞代码(也就是等待可用的代理)。

我本来打算使用这个方法

但是这个方法在下载中间件中真的不管用,因为方法process_request(self, request, spider)需要等待isinstance(response, (Response, Request))

那我该怎么做才好呢?

暂无标签

1 个回答

1

你可以使用Twisted中的“deferToThread”这个方法来运行一些会阻塞的代码,而不会影响主线程的运行。

from twisted.internet.threads import deferToThread

class DownloaderMiddleware:    
    def process_request(self, request, spider):
        return deferToThread(self.run_blocking_code_in_diffrent_thread, request, spider)

    def run_blocking_code_in_diffrent_thread(self,request, spider) -> HtmlResponse:
        print("Code will block here on a diffrent thread and wont stop MainThread")
        request.meta["proxy"] = get_proxy_blocking_call()
        return request

撰写回答