python中的异步I/O是什么?

问题描述:

对不起,这个愚蠢的初学者问题,但我有一个真正的问题了解异步I/O的概念,我不谈论回调和其他复杂的东西,我只是想了解“如何执行代码的Python”python中的异步I/O是什么?

所以在这里我想与

class Foo() 
    take a user input # line 1 
    seek for this input from the database # line 2 
    make some operation using the database output # line 3 
    make an output to the client and show the message to the page # line 4 

了解,所以如果用户将使用龙卷风例如,如果他在服务器上执行代码的例子,那么,假设我们有4客户请求url匹配类Foo的页面,那么,Python将如何执行代码;

ie;在Python中,因为它是一个Script语言,那么每一行都在执行并返回值?所以它执行线1用户1,然后停止,服务于线1客户端2等与客户的其余部分,然后跳到第2行等?

问题与python没有太多关系。这是一个关于异步python框架(即龙卷风)的问题。

龙卷风客户端异步处理。这意味着,当服务器处理客户端请求并击中完成一些异步操作的行时(在您的示例中的数据库查询 - 行#2),它会中断执行并切换到另一个客户端。当数据库查询完成时,通知它会进入队列,并且客户端在那里等待轮到它从停止点开始执行一次(行#3)。

龙卷风有它自己的客户执行模式。它被称为reactor pattern。基本上,它意味着它在客户端队列中循环并在需要时处理它们(即请求通过套接字,数据库查询finnished)。

这种无阻塞循环是通过操作系统的实用程序完成的,如Epoll

+0

那么如果第2行使用同步库(例如Pymongo),那么程序必须运行到第4行才能为第二个客户端服务? –

+1

是的,确实如此。自数据库查询完成后,使用同步库将阻止所有客户端的执行,从而有效地挂起整个服务器。使用txmongo代替或例如将pymongo请求委托给RESTfull API,然后您将通过异步HTTP客户端从Tornado服务器调用该API。编写异步服务器策略时,应尽快从处理程序返回以处理其他客户端。 – yakxxx

+0

,因为我以前认为只有第2行是阻塞数据库的问题,所以当它结束时,它会继续行4等等,所以瓶颈只在第2行 –

我认为你的问题有更多的关于python处理multithreading的方式。

虽然解释器将永远不可能用你的处理器多个核心(一些相关信息herehere),它支持在这个意义上不同的线程多线程可以在别人都在等待I/O执行。在你上面的例子,客户机程序线#1)可以同时客户端1正在等待数据库调用(线#2)返回送达。

关于“因为它是一种脚本语言,那么每一行都在执行并返回值?”,不,我想不出这样的事情; You can use generators做类似“每行返回值”的操作,但我想这不是你要找的。

+0

左右发电机,龙卷风使用它们,http://www.tornadoweb.org/documentation/gen.html,因为在第一次,我认为,因为它不像在C或C++中等待编译时间来执行,我说可以为用户提供服务只使用它需要的一些线,让他等一段时间去服务另一个线 –