在Tornado中,您如何理解ioloop?

6

我希望能找到一种方法来理解Tornado中的ioloop,因为我已经多次阅读了官方文档,但无法理解它的存在意义。

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 Node.js中的IO循环。
此外,如果我只想进行数据库查询、读取文件,为什么要关心这个低级事情呢?

Tornado的IOLoop与您笔记本电脑的设备无关,而是关于在打开的套接字和文件对象上执行异步读写操作。 - xyres
1
你需要阅读有关Linux中select函数的内容,以更好地理解异步、非阻塞I/O。因此,Tornado的IOLoop只是提供了一个API来调用底层操作系统的异步selectpoll等函数。请参见此页面-https://pymotw.com/3/select/。该页面上的代码示例是关于在套接字上执行异步I/O的。因此,Tornado的IOLoop已经处理了所有这些事情,并使用户更容易使用。 - xyres
2个回答

10
我从未听说过JavaScript Node.js中的IO循环。
在Node.js中,等价概念是事件循环。Node事件循环大多是不可见的,因为所有程序都使用它 - 它在回调之间运行。
在Python中,大多数程序不使用事件循环,因此当您需要一个时,必须自己运行它。这可以是Tornado IOLoop,Twisted Reactor或asyncio事件循环(所有这些都是特定类型的事件循环)。
Tornado的IOLoop可能会令人困惑 - 它不直接执行任何IO。相反,它协调程序中可能发生的所有不同IO(主要是网络IO)。您可以将其视为“事件循环”或“回调运行程序”。

7
更确切地说,用EventLoop来解释可能更容易理解一些,而不是使用IOLoopIOLoop.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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接