您如何理解龙卷风中的ioloop?

时间:2018-07-20 03:15:28

标签: python tornado

我正在寻找一种了解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循环。

此外,如果我只想执行数据库查询,读取文件,为什么还要关心这个低级的东西?

2 个答案:

答案 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)
相关问题