рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ, рдЯреЛрд░рдиреЗрдбреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рд╛ (рдЯреНрд╡рд┐рдиреНрдЯ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓рдмреИрдХ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдиреЛрдб рдореЗрдВ рд╕реАрдХ, рдЬреЗрдмреА, рд░реВрдмреА рдореЗрдВ рдлрд╛рдЗрдмрд░)ред
рдиреАрдЪреЗ asyncmongo (mongoDB рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЪрд╛рд▓рдХ) рд╕реЗ рдЬреБрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ
рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреИрд▓рдмреЗрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛
class AsyncHandler(RequestHandler): @asynchronous def get(self): http_client = AsyncHTTPClient() http_client.fetch("http://example.com", callback=self.on_fetch) def on_fetch(self, response): do_something_with_response(response) self.render("template.html")
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдирдП рдореЙрдбреНрдпреВрд▓ "tornado.gen" рдХреЗ рд╕рд╛рде
class GenAsyncHandler(RequestHandler): @asynchronous @gen.engine def get(self): http_client = AsyncHTTPClient() response = yield gen.Task(http_client.fetch, "http://example.com") do_something_with_response(response) self.render("template.html")
рдореБрдбрд╝ рдХреЗ рд╕рдорд╛рди рдЬрдирд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЖрдк рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рд╕рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рд░рд┐рдЯрд░реНрди
def get(self): http_client = AsyncHTTPClient() response1, response2 = yield [gen.Task(http_client.fetch, url1), gen.Task(http_client.fetch, url2)]
рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ (рдХреЙрд▓рдмреИрдХ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ) рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ред
class GenAsyncHandler2(RequestHandler): @asynchronous @gen.engine def get(self): http_client = AsyncHTTPClient() http_client.fetch("http://example.com", callback=(yield gen.Callback("key")) response = yield gen.Wait("key") do_something_with_response(response) self.render("template.html")
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдмрд╡рдВрдбрд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рдХреИрд╕реЗ asyncmongo рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
class MainHandler(tornado.web.RequestHandler): @property def db(self): if not hasattr(self, '_db'): self._db = asyncmongo.Client(pool_id='mydb', host='127.0.0.1', \ port=27017, maxcached=10, maxconnections=50, dbname='test') return self._db @web.asynchronous @gen.engine def get(self): r, error = yield gen.Task(self.db.user.save, { 'login':'tester' }) r, error = yield gen.Task(self.db.user.find_one, {}) self.write(str(r[0])) self.finish()
рдпрд╣рд╛рдВ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡ рдФрд░ рдлрд╛рдЗрдВрдб_рдСрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓реЗ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдмреИрд╕рд╛рдЦреА-рдЖрд╡рд░рдг рдмрдирд╛рдпрд╛, рддрд╛рдХрд┐ рдореЛрдВрдЧреЛрдбрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рд╕рд┐рдХ рдХреА рддрд░рд╣ рд╣реЛ (db.user.save ({'login': 'tester'}), db.user.find_one ({}))
class MainHandler(tornado.web.RequestHandler): @property def db(self): if not hasattr(self, '_db'): self._db = tornadomongo.mongo_client(pool_id='mydb', host='127.0.0.1', port=27017, maxcached=10, maxconnections=50, dbname='test') return self._db @web.asynchronous @gen.engine def get(self):
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рджрд┐рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлрд┐рд░ рд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :)
рдХреМрди рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЯреЙрд░реНрдирд╛рдбреЛрдореЛрдВрдЧреЛ рдореЙрдбреНрдпреВрд▓ рдпрд╣рд╛рдБ рд╣реИ: hg рдХреНрд▓реЛрди
bitbucket.org/lega911/tornadomongoрдЗрд╕рдореЗрдВ, рдореБрдЭреЗ рдмрд╡рдВрдбрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ "рдЧрдВрджрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди" рдмрдирд╛рдирд╛ рдерд╛, рддрд╛рдХрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХреБрдЫ рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЛ tornado.gen рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░ рджрд┐рдпрд╛, рдирддреАрдЬрддрди, рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рд╣реЛ рдЧрдИ, рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдмрдврд╝ рдЧрдИ (рдЙрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА)ред
рдкреБрдирд╢реНрдЪ: рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдореЙрдбреНрдпреВрд▓ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛:
www.tornadoweb.org/documentation/gen.html