1.twisted 的异步基于Deferreds对象
使用twisted 编写异步代码时要先导入defer 和reactor

from twisted.internet import defer, reactor
from twisted.web.client import getPagefrom twisted.internet import reactor, defer
from twisted.web.client import getPagedef print_(n):"""将返回的数据解码"""print(n.decode('UTF-8'))@defer.inlineCallbacks               # 这个装饰器方便我们返回多个Deferred对象
def func(n):print('%s开始' % n)# 使用twisted 里的函数发送网络请求, 返回的是Deferred对象s = getPage('http://www.baidu.com'.encode('UTF-8'))# 添加回调函数s.addCallback(print_)print('休眠%s秒' % n)print('%s结束' % n)print('**********************\n')yield sdef down(arg):"""关闭事件循环reactor"""reactor.stop()if __name__ == '__main__':# 调用func函数并得到Deferred对象lis = [func(i) for i in range(3)]# 将Deferred对象放入DeferredListd = defer.DeferredList(lis)# 当DeferredList里的回调函数执行完了 就执行down函数d.addBoth(down)# 启动reactorreactor.run()

2.用twisted写一个超简单的异步爬虫


import queue
from twisted.internet import defer          #defer.Deferred(特殊的socket对象),不会发请求
from twisted.internet import reactor        #socket对象(如果下载完成...
from twisted.web.client import getPage      #事件循坏class Request:def __init__(self, url, callback):self.url = urlself.callback = callbackclass HttpResponse:def __init__(self, content, request):self.content = contentself.request = requestself.url = request.urlself.text = str(content.decode('UTF-8'))class XueXiSpider:name = 'xue_xi'def start_request(self):start_url = ['http://www.baidu.com', 'http://www.bing.com', ]for url in start_url:yield Request(url, self.parse)def parse(self, response):print(response.url)yield Request('http://www.cnblogs.com', callback=self.parse)schedule = queue.Queue()class Engine:def __init__(self):# 用来关闭deferred对象self._close = None# 最大并发数self.max = 5# 存放要下载的request用来限制并发数self.crawling = []def get_response_callback(self, content, request):"""调用request的callback函数解析下载的内容并将返回的request对象压入调度器:param content: 下载内容:param request: request对象:return:"""# 移除下载完的requestself.crawling.remove(request)# 生成response对象response = HttpResponse(content, request)# 调用parse解析responsereqs = request.callback(response)import types# 返回的是生成器对象就迭代它if isinstance(reqs, types.GeneratorType):for req in reqs:# 加入调度器schedule.put(req)def _next_request(self):"""不断从队列中获取request, 当符合条件时关闭deferred对象:return:"""# 判断是否要关闭deferred, defer.Deferred()对象需要手动关闭if len(self.crawling) == 0 and schedule.qsize() == 0:self._close.callback(None)return# 限制并发, crawling里的request属相大于5就直接返回, 不在下载if len(self.crawling) > self.max:returnwhile len(self.crawling) < self.max:try:# 从调度器中取出request, block=False以不阻塞的方式req = schedule.get(block=False)# 将要下载的request加入下载列表中self.crawling.append(req)# 调用twisted的getPage 来发起url请求, getPage返回的对象在回调结束后会自动移除d = getPage(req.url.encode('UTF-8'))# 添加解析response回调d.addCallback(self.get_response_callback, req)# 数量不足添加next_request回调继续获取request下载d.addCallback(lambda _: reactor.callLater(0, self._next_request))except Exception as e:print(e)return@defer.inlineCallbacksdef crawl(self, spider_):"""将初始request压入队列, 定时启动self._next_request:param spider_: spider对象:return: deferred对象"""# 获取初始requeststart_requests = iter(spider_.start_request())while True:try:# 加入队列schedule.put(next(start_requests))except StopIteration:break# 调用crawl函数后不会立刻执行self._next_request, 而是要等到reactor.run()调用后才会执行self._next_request# 0秒后调用self._next_requestreactor.callLater(0, self._next_request)# 创建不会自动结束的defer.Deferred()对象 赋值给self._close, 在队列和下载列表为空时结束defer.Deferred()对象self._close = defer.Deferred()yield self._closeif __name__ == '__main__':# 创建集合存放deferred对象_active = set()# 生成spider对象spider = XueXiSpider()# 创建引擎engine = Engine()# 调用crawl方法 返回deferred对象d = engine.crawl(spider)_active.add(d)dd = defer.DeferredList(_active)# 添加结束回调, 当self._close.callback(None) 后停止reactordd.addBoth(lambda a: reactor.stop())# 启动主事件循环reactor.run()# 注意上述代码中deferred对象未添加addErrorback()错误处理函数, 一旦deferred回调函数出错, 程序不会报错, 会一直卡在那里# lambda 函数要加入一个参数, 不能不填参数

twisted学习笔记相关推荐

  1. python笔记基础-Python学习笔记(基础)

    python基础学习笔记.语法.函数等. 基础定义utf-8文件头#!/usr/bin/env python3 # -*- coding: utf-8 -*- 2.循环// name是值 names是 ...

  2. 【学习笔记】爬虫框架Scrapy入门

    一. Scrapy简介.架构.数据流和项目结构 二. Scrapy入门 1. Scrapy架构由哪些部分组成? 1.1 Scrapy简介 Scrapy是:由Python语言开发的一个快速.高层次的屏幕 ...

  3. python学习笔记(一)Python 简单介绍

    Python学习笔记(一)Python 简单介绍 Python介绍 Python简介 Python应用领域 Python是解释型的语⾔ 编译和解释的区别是什么? 编译型vs解释型 编译型 解释型 Py ...

  4. 《Python核心编程(第3版)》学习笔记及书评

    <Python核心编程(第3版)>学习笔记 文章目录 <Python核心编程(第3版)>学习笔记 写在前面 1. 正则表达式 1.1 常用语法 1.2 re模块 2. 网络编程 ...

  5. qesa Efficient zero-knowledge arguments in the discrete log setting 学习笔记

    1. 引言 Hoffmann等人 2019年论文 <Efficient zero-knowledge arguments in the discrete log setting >. 相应 ...

  6. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  7. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

最新文章

  1. SQL server2008 无法启动调试存储过程
  2. UVA 10603 Fill
  3. ubuntu 12.04 php升级,在 Ubuntu 12.04 LTS 中将 PHP 从 5.3 升级到 5.5
  4. USB驱动程序之概念介绍学习笔记
  5. oracle中的存储过程教程,oracle 存储过程
  6. linux退出windows域,删除Windows AD域控制器的三种方法
  7. linux-history历史命令-光标的移动操作-命令行上的字符删除操作
  8. 【总结】大规模数据测试,数据准备时需要注意的问题(【保护已有数据】【大规模数据影响普通测试】【不要着急删除数据】)
  9. php二级域名 同步登录,php网站单点登录--卷一(跨二级域名)
  10. 【Codevs 3115】高精度练习之减法
  11. Python的numpy,1.15.0和1.14.5,函数结果可能存在差异
  12. 视屏教程、电子书、技术文档
  13. 从学习2021美赛O奖论文到获得2022美赛M奖——论文精读经验分享
  14. LIKE 多字段匹配 效率低下
  15. IAR for STM8下载、安装、注册
  16. NXP S32K146 CAN通讯 TJA1043(一)
  17. 国足0:2不敌韩国 淘汰赛将战泰国
  18. 视频目标分割数据集DAVIS(Denly-Annotated VIdeo Segmentation)解读
  19. 方向键按键转发,模仿笔记本Fn按键
  20. 聊一聊以前公司的测试流程

热门文章

  1. 怎样编写一个chatgpt聊天网页
  2. 使用 ffmpeg 命令实现图片和视频相互转换
  3. 欧姆龙温控器参数笔记(五)(高级功能设定菜单)
  4. Ubuntu20.04基本配置指北——让Ubuntu成为可办公系统
  5. 【国产MCU学步随笔------兆易创新GD32f103CBT6,及vscode编辑环境配置】
  6. 【Java高级特性】集合框架和泛型(一)
  7. 安装SQL2000时的几个问题和解决方法
  8. 对VMware已经创建的虚拟机进行磁盘扩容
  9. 微信小程序-(js和wxml中)utils公共方法使用
  10. 高端三维制作-高级版》(Softimage XSI 2010 SP1)