Написание собственных асинхронных библиотек с помощью 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()
Добавить комментарий