在Scrapy的下载中间件中使用Deferred
我打算在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