Написание собственных асинхронных библиотек с помощью Tornado

Для написания собственной асинхронной библиотеки с помощью фреймворка Tornado будем использовать декоратор tornado.gen. Результат выполнения возвращается с помощью callback. Необходимо так же понимать, что при написании обертки над синхронными библиотеками, они не станут асинхронными. И вызов yield gen.Task(my_func, my_arg) - не выполниться асинхронно, если my_func - будет синхронной.
Пример асинхронной библиотеки, файл my_lib.py:
import tornado.gen
class MyLib():
@tornado.gen.engine
def print_some_text(self, some_text, callback=None):
result = "Print: '{0}'".format(some_text)
error = None
callback(result, error)
@tornado.gen.engine
def check_error(self, callback=None):
error = "This is the error"
callback(None, error)
Пример обработчика, с использованием собственной асинхронной библиотеки:
from my_lib import MyLib
mylib = MyLib()
class Handler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
print("get")
future = tornado.gen.Task(mylib.print_some_text, some_text="What's up?")
response = yield future
(result, error) = response.args
if error:
raise tornado.web.HTTPError(500, error)
else:
self.set_header("Content-type", "text/html")
self.write("result : {0}".format(result))
self.write("error : {0}".format(error))
self.finish()
Добавить комментарий