我正在寻找一种了解ioloop in tornado的方式,因为我已经多次阅读了官方文档,但听不懂。具体来说,为什么存在。
from tornado.concurrent import Future
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
def async_fetch_future():
http_client = AsyncHTTPClient()
future = Future()
fetch_future = http_client.fetch(
"http://mock.kite.com/text")
fetch_future.add_done_callback(
lambda f: future.set_result(f.result()))
return future
response = IOLoop.current().run_sync(async_fetch_future)
# why get current IO of this thread? display IO, hard drive IO, or network IO?
print response.body
我知道什么是IO,即输入和输出,例如读取硬盘驱动器,在屏幕上显示图形,获取键盘输入。
根据定义,IOLoop.current()
返回此线程的当前io循环。
我的笔记本电脑上有很多IO设备正在运行此python代码。 IOLoop.current()
返回哪个IO?我从未听说过JavaScript nodejs中的IO循环。
此外,如果我只想执行数据库查询,读取文件,为什么还要关心这个低级的东西?
答案 0 :(得分:2)
我从没听说过JavaScript nodejs中的IO循环。
在node.js中,等效概念是event loop。节点事件循环几乎是不可见的,因为所有程序都使用它-这就是您的回调之间正在运行的东西。
在Python中,大多数程序都不使用事件循环,因此,如果需要一个事件循环,则必须自己运行它。这可以是Tornado IOLoop,Twisted Reactor或asyncio事件循环(所有这些都是特定类型的事件循环)。
Tornado的IOLoop的名称可能令人困惑-它不直接执行任何IO。相反,它协调程序中可能发生的所有不同IO(主要是网络IO)。它可以帮助您将其视为“事件循环”或“回调运行器”。
答案 1 :(得分:1)
不用说它是IOLoop
,也许EventLoop
更让您理解。
IOLoop.current()
并不真正返回IO设备,而只是返回一个纯Python事件循环,该循环基本上与asyncio.get_event_loop()
或nodejs
中的基础事件循环相同。
之所以需要事件循环来执行数据库查询,是因为您使用事件驱动的结构来执行数据库查询(在您的示例中,您正在执行http请求)。
大多数时候,您不需要关心这种低级结构。相反,您只需要使用async&await
关键字即可。
假设有一个支持异步数据库访问的库:
async def get_user(user_id):
user = await async_cursor.execute("select * from user where user_id = %s" % user_id)
return user
然后,您只需要在处理程序中使用此功能:
class YourHandler(tornado.web.RequestHandler):
async def get():
user = await get_user(self.get_cookie("user_id"))
if user is None:
return self.finish("No such user")
return self.finish("Your are %s" % user.user_name)