AsyncHTTPClient
是Tornado的tornado.httpclient
提供了一个基于框架本身的异步HTTP客户端。
例如:使用异步调用AsyncHTTPClient
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
url = "https://www.jianshu.com"
async def fn():
client = AsyncHTTPClient()
response = await client.fetch(url)
print(response.body)
if __name__ == "__main__":
IOLoop.current().run_sync(fn)
AsyncHTTPClient
可以以使用回调callback
和协程yield
两种方式,使用callback
方式不会返回结果,而使用yield
则会返回response
。
callback
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from tornado.httpclient import AsyncHTTPClient
def async_fetch(url, callback):
# 创建异步HTTP客户端对象
client = AsyncHTTPClient()
# 创建内部函数用于处理返回结果
def handle_response(response):
callback(response.body)
# 异步处理结束后调用指定的回调函数
client.fetch(url, callback=handle_response)
yield
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from tornado.httpclient import AsyncHTTPClient
from tornado import gen
# 添加异步访问的装饰器
@gen.coroutine
def coroutine_fetch(url):
# 创建异步HTTP客户端对象
client = AsyncHTTPClient()
# 获取异步结果时使用yield
response = yield client.fetch(url)
# 使用抛出异常的方式来返回结果,注意不能使用return来返回。
raise gen.Return(response.body)
yield
挂起函数协程,尽管没有阻塞block
主线程,但需要处理返回值,挂起到响应执行也还是有时间等待。相对于单个请求而言,另一种使用异步和协程的方式是在主线程之外使用线程池,线程池依赖于future
。