首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tornado异步模式

Tornado异步模式

作者头像
py3study
发布2020-01-15 17:02:45
1.4K1
发布2020-01-15 17:02:45
举报
文章被收录于专栏:python3python3

先介绍下背景:由于工作需要,前段时间又写了一段爬虫去获取和更新一些数据。之前爬虫主要用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)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档