在龙卷风回调

时间:2017-10-26 12:52:35

标签: tornado

我正在尝试使用@ return_future使以下代码异步。我有time.sleep()因为我的应用程序需要阻塞功能。 但是我不知道要回调什么以使其成为异步。我是TORNADO的初学者。

在以下代码中有两个html文件" register.html"和welcome.html。任何帮助将不胜感激。#Asynchronous

import time
import json
import tornado.web
import tornado.ioloop
from tornado import gen
from tornado.concurrent import return_future
from BaseHTTPServer import BaseHTTPRequestHandler

execfile("jdict.py")

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("welcome.html")

class LoginHandler(MainHandler):
    def get(self):
        self.render("register.html")                                  
    @return_future
    def post(self,callback=None):
    dict={}
       wmap_dict=import_dict('user_data')
       dict["uname"]=self.get_argument("uname")
       dict["uid"]=self.get_argument("uid")
       u_key=dict["uid"] +':' +self.get_argument("uname")
       jline={}
       jline[u_key]=dict
       print (jline)
       with open("user_data",'a')as f:
            f.write(json.dumps(jline))
            f.write("\n")
    time.sleep(5)
    callback()
    self.redirect("/")



application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/login", LoginHandler),
], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__")

application.listen(5500)
tornado.ioloop.IOLoop.current().start()

`

1 个答案:

答案 0 :(得分:1)

@return_future采用回调式异步代码,并使其在协程中可用。它不会使同步代码异步。为此,您需要concurrent.futures.ThreadPoolExecutor

# executor can be a global
executor = concurrent.futures.ThreadPoolExecutor()

class MyHandler(RequestHandler):
    @gen.coroutine
    def post(self):
        yield executor.submit(self.do_something_slow)
        self.redirect("/")

    def do_something_slow(self):
        time.sleep(5)

有关详情,请参阅the Tornado FAQ

相关问题