我们看下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())
异步是依赖于事件循环的,需要在事件循环中来完成异步操作。