python - 在Scrapy下载器中间件中使用Deferred

标签 python scrapy twisted

我将在Scrapy下载器中间件中使用一些阻塞代码(等待免费代理)。 我打算使用this method

但是它在downloadermiddleware中确实不起作用,因为方法 process_request(self, request, spider)等待isinstance(response, (Response, Request))

如何最好地做到这一点?

最佳答案

您可以使用扭曲方法“deferToThread”来运行阻塞代码而不阻塞MainThread

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

关于python - 在Scrapy下载器中间件中使用Deferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26711309/

相关文章:

python - 如何为图形级函数编辑 seaborn 图例标题和标签

python - **kwargs 构造在 python 中的实现

python - Scrapy 爬取页面,但抓取 0 项

python - 扭曲的海螺文件传输

python - 如何在python中控制子线程进程?

python - sorl-缩略图语法错误

python - Django 休息框架。检索的工作原理

redis - 如何将mongo数据插入redis列表

python正则表达式查找外野手的名字

python - twistd 可以像 django 一样自动重置服务器吗?