Tornado实现多线程、多进程HTTP服务

背景 线上有一个相关百科的服务,返回一个query中提及的百科词条。该服务是用python实现的,以前通过thrift接口访问,现要将其改为通过HTTP访问。之前没有搭建HTTPServer的经验,因此想用python的web Framework来做这件事,于是有了下面的工作。第一部分是框架选择,这一部分没有太仔细考虑,只是大概看了一些文章。第二部分是根据所需要的功能,学习及测试在框架上应该如何实现。第三部分是实际的代码。第四部分是下一步的学习。 框架选择 python有很多开源的web framework。从知乎上找了几篇综述型的简介,大体包括:Django、Bottle、Flask、web2py、Tornado。看中了介绍中提及Tornado的速度与并发量,于是打算用tornado来实现。所以按目前的了解,或许Tornado并非实现本工作的最佳方案,只是一个可行方案。 学习与测试 用tornado开发web服务的基本流程 tornado具有web framework的功能,因此用它开发web服务非常方便: 实现处理请求的Handler,该类继承自tornado.web.RequestHandler,实现用于处理请求的对应方法如:get、post等。返回内容用self.write方法输出。 实例化一个Application。构造函数的参数是一个Handlers列表,通过正则表达式,将请求与Handler对应起来。通过dict将Handler需要的其他对象以参数的方式传递给Handler的initialize方法。 初始化一个tornado.httpserver.HTTPServer对象,构造函数的参数是上一步的Application对象。 为HTTPServer对象绑定一个端口。 开始IOLoop。 原服务的特点 原服务是一个内存占用大,IO密集,计算量适中的服务。 内存占用大。需要加载一个比较大的词表,其中每个词对应一个id列表,这一部分是C++实现的,通过boost.python封装为python可调用的so。原服务单进程占用内存超过5G。…

关于爬虫平台的架构实现和框架的选型(二)–scrapy的内部实现以及实时爬虫的实现

我们接着关于爬虫平台的架构实现和框架的选型(一)继续来讲爬虫框架的架构实现和狂阶的选型。 前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1、Spiders(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器) 2、Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 3、Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。 4、Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理 5、ItemPipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方. 6、Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。 7、Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。 Scrapy 爬虫整过处理的过程如下: 每一个用scrapy创建的爬虫项目都会生成一个middlewares.py文件,在这个文件中定义了两个处理中间件SpiderMiddleware和DownloaderMiddleware,这两个中间件分别负责请求前的过滤和请求后的response过滤。 上面介绍了基于scrapy的异步爬虫,下面介绍一下实时爬虫,也就是爬虫数据实时返回。 我们可以用requests+BeautifulSoup来进行实现。…