我正在尝试使用@ 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()
`
答案 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。