2013-02-17 47 views
0

对不起,这个愚蠢的问题,我想了解使用生成器替换龙卷风回调背后的原因,如何生成器可用于非阻塞操作?为什么在tornado.gen中使用生成器?

我以为一个生成器只在返回很多项时才有用,所以为了节省内存,我们避免了迭代器并且一个生成一个元素,所以如果只有一个元素返回,那么非阻塞调用的好处在哪里(例如一个http响应)?

,如果我这个简单的例子:

class GenAsyncHandler(tornado.web.RequestHandler): 
@tornado.web.asynchronous 
@tornado.gen.engine 
def get(self): 
    http_client = tornado.httpclient.AsyncHTTPClient() 
    response = yield tornado.gen.Task(http_client.fetch, "http://www.google.fr") 
    self.write(str(response)) 
    self.finish() 

结果是:

HTTPResponse(code=200,request_time=0.4440000057220459,buffer=<_io.BytesIO object at 0x000000000316A728>,_body=None,time_info={},request=,effective_url='http://www.google.fr',headers={'X-Xss-Protection': '1; mode=block', 'Set-Cookie': 'PREF=ID=6e27eda171946585:FF=0:TM=1361200384:LM=1361200384:S=7VncGsz1u8j_UL1a; expires=Wed, 18-Feb-2015 15:13:04 GMT; path=/; domain=.google.fr,NID=67=qv6MUCQCGJ5mnofKWdySxo8NoThLfCr9oFlme8S95w2CNqQe__tW6ql3RzqItvfbFxzxCYLZ0OINzFvE7mIDJbXOjjhld0ahQrxfzizkdNhymcI9oAGK0dotqDHwhtR2; expires=Tue, 20-Aug-2013 15:13:04 GMT; path=/; domain=.google.fr; HttpOnly', 'Expires': '-1', 'Server': 'gws', 'Connection': 'close', 'Cache-Control': 'private, max-age=0', 'Date': 'Mon, 18 Feb 2013 15:13:04 GMT', 'P3p': 'CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."', 'Content-Type': 'text/html; charset=ISO-8859-1', 'X-Frame-Options': 'SAMEORIGIN'},error=None) 

这是否结果splited到 '暂停'?

回答

1

否您的结果不是因为它只会在您调用flush时发送。

如果你有一个窗体,然后想要将它异步保存在你的数据库中,你不需要创建另一个函数,你不需要将它传递到你的视图中。

@web.asynchronous 
@gen.engine 
def post(self): 
    form = inscription.Particulier(TornadoDict(self)) 
    form.application = self.application 
    if form.validate(): 
     password = passwords.encode(self.get_argument('password'), 
            self.get_argument('email')) 
     values = (self.get_argument('email'), 
        password, 
        self.get_argument('nom'), 
        self.get_argument('prenom'), 
        self.get_argument('adresse'), 
        self.get_argument('ville'), 
        self.get_argument('telephone'), 
        self.request.remote_ip,) 
     cursor = yield momoko.Op(self.db.execute, 
        sql.INSERT_PROFILE_PARTICULIER, 
        (values)) 
     result = cursor.fetchone()[0] 
     if result[0] == 'ok': 
      form[result[0]].errors.append(result[1]) 
      self.render('inscription/particulier.html', form=form) 
     else: 
      self.redirect('/app') 
    else: 
     self.render('inscription/particulier.html', form=form) 
+0

啊,我现在看到的效用,因此,在该示例中龙卷风DOC其中响应=屈服gen.Task(http_client.fetch,“http://example.com”),这意味着所述响应是分裂太? – 2013-02-17 18:12:10

+1

耶基本上gen允许与async相同的东西,但在相同的范围内。 – Fred 2013-02-17 19:59:09

+0

抱歉,我没有明白这一点?例如在你给的例子中,它保存了第一个然后等待,否则继续操作,直到someelse请求服务器,但是一长串'数据'(例如HTTP响应) – 2013-02-17 20:21:43

相关问题