Tornado异步模式
先介绍下背景:由于工作需要,前段时间又写了一段爬虫去获取和更新一些数据。之前爬虫主要用Scrapy框架批量爬取一些页面数据,或者用Gevent调用目标站点的接口。偶然看到了Tornado,听说这个框架很强大,所以打算这次爬虫用Tornado试试。不足之处,欢迎指正。
总的来说,Tornado是Python里面一个轻量的异步非阻塞的框架,性能非常不错,最新版本的异步协程是基于Python内置的asyncio来实现(老版本用装饰器实现异步)。Tornado可以用来做Web服务,或者利用其异步功能,完成一些异步执行的操作,比如爬虫(PySpider就是基于Tornado实现)。
本次任务,涉及到调用百度自然语言理解(NLU)平台UNIT的一些接口,实现一些自动化和批量操作,比如词槽导入导出,开始机器学习训练,批量测试语句等等。没有拿到百度UNIT平台的接口文档,所以只能通过爬虫形式,模拟用户登录,然后进行各种操作。为了让本篇看起来更简洁,本次不打算详细介绍如何爬取百度UNIT平台,统一调用httpbin(http://www.httpbin.org/get)进行简化。百度UNIT平台的爬虫后续再补充。
说了那么多,重点来了。Tornado两种异步模式:
1,add_callback(基于asyncio,资源消耗少,性能还不错)
2,run_in_executor((基于线程池/进程池,性能很好,但是资源消耗要高于add_callback的方案)
两种模式的代码如下。
add_callback方案:
from tornado.ioloop import IOLoop, PeriodicCallback
import requests # 业务逻辑操作写在这里
def job():
url = 'http://www.httpbin.org/get'
resp = requests.get(url)
print(resp.text) async def runner():
loop = IOLoop.current()
#任务派发写在这里
for i in range(10):
loop.add_callback(job) print('This will be executed before loop is finished') if __name__ == '__main__':
IOLoop.current().run_sync(runner)
run_in_executor方案:
from tornado.ioloop import IOLoop, PeriodicCallback
import requests
from concurrent.futures import ThreadPoolExecutor # 业务逻辑写在这里
def job():
url = 'http://www.httpbin.org/get'
resp = requests.get(url)
print(resp.text) async def runner():
loop = IOLoop.current() # 也可以用进程池ProcessPoolExecutor
exectutor = ThreadPoolExecutor(20)
# 任务派发写在这里
for i in range(10):
loop.run_in_executor(exectutor, job) print('This will be executed before loop is finished') if __name__ == '__main__':
IOLoop.current().run_sync(runner)
Tornado异步模式的更多相关文章
- Tornado异步非阻塞的使用以及原理
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...
- 5.(基础)tornado异步
终于到了传说中的异步了,感觉异步这个名字听起来就很酷酷的,以前还不是多擅长Python时,就跑去看twisted的源码,结果给我幼小的心灵留下了创伤.反正包括我在内,都知道异步编程很强大,但是却很少在 ...
- 高性能的关键:Spring MVC的异步模式
我承认有些标题党了,不过话说这样其实也没错,关于“异步”处理的文章已经不少,代码例子也能找到很多,但我还是打算发表这篇我写了好长一段时间,却一直没发表的文章,以一个更简单的视角,把异步模式讲清楚. 什 ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- 基于事件的异步模式(EAP)
什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...
- 与其他.Net异步模式和类型进行互操作
返回该系列目录<基于Task的异步模式--全面介绍> Tasks和异步编程模型APM(Tasks and the Asynchronous Programming Model) 从APM到 ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- 实现基于Task的异步模式
返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...
- 基于Task的异步模式的定义
返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...
随机推荐
- HDU 5217 Brackets
[题意概述] 给出一个有左括号和右括号的序列,左边的左括号和右边的右括号可以合并.现在要求你维护这个序列,支持两种操作: 1,翻转某个位置的括号: 2,查询区间[L,R]合并后第k个括号在原序列中的位 ...
- BZOJ 1468 Tree 【模板】树上点分治
#include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg registe ...
- CSS3制作404立体字体
CSS3制作404立体字体页面效果 鼠标移动上去,背景色变白. 动态效果: .demo p:first-child span:hover { text-shadow:0px ...
- 50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
如果你使用的是spring boot 1.4.0版本的话,那么你可能需要配合以下文章进行学习 90.Spring Boot 1.4 使用log4j错误[从零开始学Spring Boot] Log4j是 ...
- poj 2420 模拟退火法基础
/* 题意:给n个电脑,求一个点到这n个电脑的距离和最小. 模拟退火法:和poj1379的方法类似 因为坐标范围是0-10000 不妨把它看成是10000*10000的正方形来做 */ #includ ...
- Hyper-v交换机添加出错解决方法
这个问题中文找不到解决方法,只能重新安装系统了 重新安装系统后,按照顺序操作,不要去动设备管理器中的东西,也不用动驱动,先删除虚拟机的网络连接,在删除虚拟交换机就可以了,没有再出现问题
- 夜话JAVA设计模式之策略模式
策略模式 定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户.设计原则1 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在 ...
- Html5 history Api简介
一. Html4的History API back() 后退,跟按下“后退”键是等效的. forward() 前进,跟按下“前进”键是等效的. go() 用法:history.go(x):在历史的范围 ...
- 字段not null属性要放在最后面写,最少在类型后面写
报错:create table test2211(id not null bigint ,age timestamp); 正确写法:create table test2211(id bigint no ...
- 从尾到头打印链表——剑指Offer
https://www.nowcoder.net/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage= ...