0

このばかげた質問で申し訳ありませんが、竜巻のコールバックを置き換えるためにジェネレーターを使用する理由を理解したいのですが、ジェネレーターがノンブロッキング操作でどのように役立つのでしょうか?

ジェネレーターは多くのアイテムを返す場合にのみ役立つと思ったので、メモリを節約するために、イテレーターを避けて1つの要素を生成します。したがって、返す要素が1つしかない場合のノンブロッキング呼び出しの利点はどこにありますか(例: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)

この結果は「一時停止」に分割されますか?

4

1 に答える 1

1

いいえ、フラッシュを呼び出したときにのみ送信されるため、結果はそうではありません。

ジェネレーターを使用すると、別の関数を作成する必要はありません。たとえば、フォームがあり、データベースに非同期で保存したい場合、それをビューにレンダリングするために渡す必要はありません。

@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)
于 2013-02-17T15:37:13.157 に答える