Tornado学习笔记第二篇-异步和非阻塞篇

我们看下tornado 下的httpclient模块有哪些类。

image.png

这个小节我们主要学习下红框中的四个类。

HTTPClient

HTTPClient是一个同步请求的方法类,我们可以直接类比于requests库。

我们看下官方文档的一个例子:

from tornado import httpclient

http_client = httpclient.HTTPClient()
try:
    response = http_client.fetch("http://www.google.com/")
    print(response.body.decode("utf8"))
    
except httpclient.HTTPError as e:
    # HTTPError is raised for non-200 responses; the response
    # can be found in e.response.
    print("Error: " + str(e))
    
except Exception as e:
    # Other errors are possible, such as IOError.
    print("Error: " + str(e))
    
http_client.close()

整个操作都是同步的操作。

AsyncHTTPClient

AsyncHTTPClient是异步式的请求方式,使用协程完成请求。

我们看下官方文档的例子:

async def f():
    http_client = AsyncHTTPClient()
    try:
        response = await http_client.fetch("http://www.google.com")
    except Exception as e:
        print("Error: %s" % e)
    else:
        print(response.body.decode("utf8"))
        
 # 相比于使用 select 完成的非阻塞 这种方式必须等函数执行完 协程才算执行完

我们通过协程的方式来完成异步请求,不过想要完成协程的运行还是需要事件循环的。

if __name__ == "__main__":
    import tornado
    # 事件循环只能有一个线程去循环 这个io_loop是全局唯一的 (通过单例模式来实现)
    io_loop = tornado.ioloop.IOLoop.current()

    # run_sync方法可以在运行完某个协程之后停止事件循环
    
    # 相比于 永远执行的 while 1 这种方式更高效
    io_loop.run_sync(f)

除了使用Tornado来实现事件循环,我们还可以使用更加底层的asyncio

if __name__ == "__main__":
    import asyncio
    asyncio.get_event_loop().run_until_complete(f())

异步是依赖于事件循环的,需要在事件循环中来完成异步操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考资料 https://www.cnblogs.com/becker/p/9335136.html Tornad...
    JunChow520阅读 2,302评论 0 5
  • 简介 Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而...
    JunChow520阅读 54,095评论 4 46
  • 其中Tornado的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,...
    HappyOn阅读 2,161评论 2 5
  • 原创文章出自公众号:「码农富哥」,如需转载请请注明出处!文章如果对你有收获,可以收藏转发,这会给我一个大大鼓励哟!...
    大富帅阅读 9,982评论 3 21
  • 今天我们开始入新坑Tornado,学习和Flask不一样的web开发框架。一起加油。。。 我们先看下百度百科上关于...
    码农小杨阅读 877评论 0 0