Tornado本身提供了异步并发(协程)实现。
使用Python异步编程时,我们有多种选择。比如callback、Promise、Future……
基本
这里提供一种最佳实践(Python3.5及以上):
from tornado.ioloop import IOLoop
from tornado.httpclient import AsyncHTTPClient
async def fetch_coroutine(url):
'协程获取网络资源'
http_client = AsyncHTTPClient()
response = await http_client.fetch(url)
print('response', response)
IOLoop.current().run_sync(lambda: fetch_coroutine('http://www.baidu.com'))
可以看到,异步函数语法近似node的async-await语法。但是异步函数不能直接调用,必须用IOLoop.current().run_sync(<function>)
来执行(这一点类似于node的co函数)。注意,这个函数的执行是同步的,执行时阻塞后面代码。
另外,想要正确异步执行操作,关键函数必须本身是异步的。比如上面的http_client.fetch()
。使用urllib的同步方法获取是不能真正实现异步并发的。
python有些库可以支持异步IO,比如motor是一个异步的Mongodb driver。
一些同步函数的异步版本可以在tornado.sleep()中找到。比如time.sleep()的异步版本:tornado.gen.sleep()。