tornado异步执行任务

from concurrent.futures import ThreadPoolExecutor
from functools import partial, wraps
import time
import tornado.ioloop
import tornado.web
from tornado.options import define, options
define("port", default=8011, help="run on the given port", type=int)
EXECUTOR = ThreadPoolExecutor(max_workers=4)
def unblock(f):
    @tornado.web.asynchronous
    @wraps(f)
    def wrapper(*args, **kwargs):
        self = args[0]
        def callback(future):
            self.write(future.result())
            self.finish()
        EXECUTOR.submit(
            partial(f, *args, **kwargs)
        ).add_done_callback(
            lambda future: tornado.ioloop.IOLoop.instance().add_callback(
                partial(callback, future)))
    return wrapper
class JustNowHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("i hope just now see you")
class SleepHandler(tornado.web.RequestHandler):
    @unblock
    def get(self, n):
        import requests
        print requests.request("get","http://localhost:8101/sleep")
        return "Awake! %s" % time.time()
# class SleepAsyncHandler(tornado.web.RequestHandler):
#     @tornado.web.asynchronous
#     def get(self, n):
#         def callback(future):
#             self.write(future.result())
#             self.finish()
#         EXECUTOR.submit(
#             partial(self.get_, n)
#         ).add_done_callback(
#             lambda future: tornado.ioloop.IOLoop.instance().add_callback(
#                 partial(callback, future)))
#     def get_(self, n):
#         time.sleep(float(n))
#         return "Awake! %s" % time.time()
application = tornado.web.Application([
    (r"/justnow", JustNowHandler),
    (r"/sleep/(\d+)", SleepHandler)
    #(r"/sleep_async/(\d+)", SleepAsyncHandler),
])
if __name__ == "__main__":
    application.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
posted @ 2017-01-18 15:31  moon_lord  阅读(680)  评论(0编辑  收藏  举报