Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 你是如何理解《龙卷风》中的ioloop的?_Python_Tornado - Fatal编程技术网

Python 你是如何理解《龙卷风》中的ioloop的?

Python 你是如何理解《龙卷风》中的ioloop的?,python,tornado,Python,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()

我正在寻找一种理解的方法,因为我读了好几遍官方文件,但都不明白。具体来说,它存在的原因

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节点中的IO循环


此外,如果我只想做一个数据库查询,读取一个文件,为什么我要关心这个低级的事情呢

更确切地说,它是
IOLoop
,也许
EventLoop
对您的理解更清晰

IOLoop.current()
实际上并没有返回IO设备,只是一个纯python事件循环,它基本上与
asyncio.get\u event\u loop()
nodejs
中的底层事件循环相同

之所以需要事件循环来执行数据库查询,是因为您使用的是事件驱动结构来执行数据库查询(在您的示例中,您执行的是http请求)

大多数时候,您不需要关心这个低级别结构。相反,您只需要使用
async&wait
关键字

假设有一个支持异步数据库访问的库:

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)
我从未听说过javascript节点中的IO循环

在node.js中,等效的概念是。节点事件循环大部分是不可见的,因为所有程序都使用它——它是在回调之间运行的

在Python中,大多数程序都不使用事件循环,因此当您需要事件循环时,必须自己运行它。这可以是Tornado IOLoop、Twisted Reactor或asyncio事件循环(所有这些都是特定类型的事件循环)


Tornado的IOLoop可能是一个令人困惑的名字——它不直接执行任何IO。相反,它协调程序中可能发生的所有不同IO(主要是网络IO)。它可以帮助您将其视为“事件循环”或“回调运行程序”

Tornado的iLoop与您的笔记本电脑设备无关。而是在打开的套接字和文件对象上执行异步读写操作。您必须阅读Linux中的
select
函数,以便更好地理解异步、非阻塞I/O。因此,Tornado的IOLoop只是为底层操作系统的异步
select
poll
等函数提供了一个API。请参阅本页-。该页上的代码示例是关于在套接字上执行异步I/O的。所以,Tornado的IOLoop已经处理了所有这些事情,并且让用户更容易使用。