Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码。

在任何情况下,都不要写阻塞的代码。阻塞的代码包括:

  • 访问文件、数据库或者Web
  • 产生新的进程并需要处理新进程的输出,如运行shell命令
  • 执行系统层次操作的代码,如等待系统队列

Twisted提供了允许执行上面的操作但不会阻塞代码执行的方法。至于Twisted异步代码与多线程代码的比较可以参考一下下图:

多线程的代码会有多个线程,在任何给定的时刻,不大可能所有的线程都在等待某个阻塞事件的发生。当等待的带伤发生时,线程开始工作,执行一些运算,然后可能再等待其他阻塞事件。这样服务器运行多个应用,就有很多线程,经过仔细地调整调度CPU就能很好地被利用。

而Twisted只采用一个线程,它使用了操作系统的I/O复用函数,如select()poll()epoll()作为”hanger”。当遇到阻塞的操作,如result = i_block()时,Twisted会提供另一种立即可以返回的实现方式。不过返回的不是具体的值而是一个钩子,如defered = i_dont_block(),这个钩子可以挂载一个函数,里面包含着当值处于可获取状态的时候我们想要执行的代码,例如deferred.addCallback(process_result)。Twisted程序就是用这些defered操作串起来的链,它的主线程叫做Twisted Event Reactor,这个线程负责监视哪些hanger上面的资源已经就位(比如服务器对爬虫的Request有响应了)。此时,它解除链最上面的defered的阻塞状态,这个defered可以会完成一些计算然后反过来又解除了另一个defered的阻塞状态。也有一些defered需要I/O操作,它就会把这个链放回hanger,并释放CPU以执行其他任务。因为只有一个线程,Twisted不会有上下文切换的负担,并且可以节省多个线程所额外需要的资源(比如内存)。换句话说,使用这种非阻塞的结构,虽然只有一个线程,所得到的性能却和数千个线程相似。

不过说句实话,操作系统的开发者们已经对线程操作优化进行了数十年,现在性能问题已经显得不如以前那么重要了。另一个问题是,多线程的编程要写出线程安全的代码非常困难。如果你已经了解了defereds/callbacks,你会发现Twisted的代码远远要比多线程的代码简单。inlineCallbacks生成器的使用甚至会使用代码更加容易。

关于阻塞非阻塞同步异步的问题可以参考这篇博客。
关于Twisted入门级读物可以参考这篇博客。

Scrapy与Twisted相关推荐

  1. Window10/Linux 下安装 scrapy (twisted 安装失败的解决办法 )

    安装前的一些所谓的"废话" Scrapy 是一个优秀的 Python 框架,相信很多初学者在安装 Scrapy 的时候会遇到一些坑(这些坑主要体现在 Windows 下的 twis ...

  2. Scrapy基础(一) ------学习Scrapy之前所要了解的

    技术选型: Scrapy vs requsts+beautifulsoup     1,reqests,beautifulsoup都是库,Scrapy是框架     2,Scrapy中可以加入requ ...

  3. 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)

    试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...

  4. 三十二、从0到1教你用Scrapy来爬取整站天气网

    @Author:Runsen. 本文的作者是Runsen,这是我投稿到涛哥的文章,得到的稿费是88块,发现真的不要给那么公众号写稿.真的没意思. 文章目录 Scrapy介绍 一.安装scrapy 二. ...

  5. scrapy之settings参数

    #==>第一部分:基本配置<=== #1.项目名称,默认的USER_AGENT由它来构成,也作为日志记录的日志名 BOT_NAME = 'Amazon'#2.爬虫应用路径 SPIDER_M ...

  6. 这年头学爬虫还就得会点 scrapy 框架

    Hello,我是 Alex 007,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 这几天一直在练车,只能在中间休息的时候写一写博客,可怜去年报的名到 ...

  7. scrapy框架_入门Scrapy框架看这一篇文章就够了

    前言 Scrapy是一个非常优秀的框架,操作简单,拓展方便,是比较流行的爬虫解决方案. Scrapy是一个用Python写的Crawer Framework,简单轻巧而且非常方便.Scrapy使用Tw ...

  8. Scrapy:Python的爬虫框架----原理介绍

    [scrapy]学习Scrapy入门 字数2820 阅读6946 评论2 喜欢12 Scrapy介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息 ...

  9. 开源 Python网络爬虫框架 Scrapy

    开源 Python 网络爬虫框架 Scrapy:http://blog.csdn.net/zbyufei/article/details/7554322 介绍 所谓网络爬虫,就是一个在网上到处或定向抓 ...

最新文章

  1. 2022-2028年中国电池制造行业市场供需规模及投资前景预测报告
  2. 【图文】云栖大会深圳峰会:阿里云ET医疗大脑与工业大脑,机器学习平台PAI2.0...
  3. Android Fragment 你应该知道的一切
  4. 最详细的maven教程,可以收藏!
  5. 网页模板制作只为满足用户需求!
  6. iOS如何在iTunes网站查看并下载APP的dsym文件
  7. 数据库运维平台~慢日志模块设计
  8. Spring MVC中@RequestParam和@PathVariable批注之间的区别?
  9. 文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...
  10. 【转】[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx
  11. java 共享软件 保护_【Java并发.3】对象的共享
  12. java boolean 对象_为什么Java后端用Boolean属性筛选不出对象,但改成String类型就可以了?...
  13. Mysql8安装教程——安装包版
  14. hover事件获取当前元素信息
  15. 计算机某浏览器设置主页地址,如何查看电脑中的浏览器主页是被什么软件修改的...
  16. Zabbix 地址Ping检测告警
  17. FCPX插件:10组马赛克方格图像组合展示动画预设Mosaic Animation
  18. CorelDRAW X3中文版服装创意设计视频教程
  19. 引用SMTH的一个“坑”!
  20. OpenGL glMaterialfv材质设置 用例

热门文章

  1. 单片锂离子电池恒流/恒压线形电源管理芯片
  2. 电脑关机后快速尝试开机导致电脑黑屏
  3. chatgpt4开放申请啦
  4. oracle资产模块 账期,FA模块对折旧的个人理解
  5. surface go平板安装Android系统
  6. NOIP Practice Recordings S
  7. 【Unity】OnePieceFTG(三)角色
  8. android[butterKnife(黄油刀)史诗详细使用方法]
  9. php变量结构体的深入理解,深入理解PHP内核之变量(zval)的结构
  10. 【渝粤教育】国家开放大学2019年春季 2502学前儿童发展心理学 参考试题