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

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

image-20181121144711862

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

HTTPClient

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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是异步式的请求方式,使用协程完成请求。

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

1
2
3
4
5
6
7
8
9
10
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 完成的非阻塞 这种方式必须等函数执行完 协程才算执行完

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

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

# run_sync方法可以在运行完某个协程之后停止事件循环

# 相比于 永远执行的 while 1 这种方式更高效
io_loop.run_sync(f)

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

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

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

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!