0

ハンドラーに非同期コードの一部があります。この部分を外部メソッドとして作成し、別のハンドラーから実行する必要がありますが、すべてのメソッドに非同期コードがあります。手伝って頂けますか?

簡単な例:

#!/usr/bin/python

import asyncmongo
import tornado.web    

class Handler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
                                          port=27107, dbname='mydb')

        self.db.first_names.find_one({'user_id': 1 }, 
                                     callback=self._on_response)


    def _on_response(self, response, error):
        first_name = response['first_name']
        data = {
              'first_name': first_name
        }

        # use processor
        first_name_html = self.generate_html("firstname.html").generate(**data)
        last_name_html = foo()
        self.write(first_name_html + last_name_html)
        self.finish()

    # this part of code is wrong!
    # I have question about it
    @tornado.web.asynchronous
    def foo(self):
        self.db.last_names.find_one({'user_id': 1 }, 
                                 callback=self._on_response_two)

    def _on_response_two(self, response, error):
        last_name = response['last_name']
        data = {
              'last_name': last_name
        }

        # use processor
        last_name_html = self.generate_html("lastname.html").generate(**data)
        return last_name_html
4

2 に答える 2

0

私は提案します

#!/usr/bin/python

import asyncmongo
import tornado.web    

class Handler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.db = asyncmongo.Client(pool_id='mypool', host='localhost', 
                                          port=27107, dbname='mydb')

        self.db.first_names.find_one({'user_id': 1 }, 
                                     callback=self._on_response)


    def _on_response(self, response, error):
        first_name = response['first_name']
        data = {
              'first_name': first_name
        }

        # use processor
        self.first_name_html = self.generate_html("firstname.html").generate(**data)
        foo()

    def foo(self):
        self.db.last_names.find_one({'user_id': 1 }, 
                                 callback=self._on_response_two)

    def _on_response_two(self, response, error):
        last_name = response['last_name']
        data = {
              'last_name': last_name
        }

        # use processor
        last_name_html = self.generate_html("lastname.html").generate(**data)
        self.write(self.first_name_html + last_name_html)
        self.finish()
于 2012-05-15T17:51:32.977 に答える
0

わかりやすくするために、gen.engine バージョンを使用します。

#!/usr/bin/python

import asyncmongo
import tornado.web
from tornado import gen

class Handler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @gen.engine
    def get(self):
        self.db = asyncmongo.Client(pool_id='mypool', host='localhost',
                                          port=27107, dbname='mydb')

        response, error = yield gen.Task(self.db.first_names.find_one, {'user_id': 1 })

        first_name = response['first_name']
        data = {
              'first_name': first_name
        }

        # use processor
        self.first_name_html = self.generate_html("firstname.html").generate(**data)

        self.foo()

    @gen.engine
    def foo(self):
        response, error = yield gen.Task(self.db.last_names.find_one, {'user_id': 1 })

        last_name = response['last_name']
        data = {
              'last_name': last_name
        }

        # use processor
        last_name_html = self.generate_html("lastname.html").generate(**data)
        self.write(self.first_name_html + last_name_html)
        self.finish()
于 2012-05-15T19:43:51.117 に答える