2017-10-26 20 views
0

@ return_futureを使用して次のコードを非同期にしようとしています。アプリケーションにブロック機能が必要なため、time.sleep()があります。 しかし私はそれをasync.asにするために何をコールバックするのか分からない。私はTORNADOの初心者だ。コールバック竜巻

次のコードには、2つのhtmlファイル「register.html」とwelcome.htmlがあります。すべてのヘルプは非同期

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

@return_futureがコールバックスタイルの非同期コードを受け取り、コルーチンにそれが使用可能になりappreciated.`#だろう。同期コードは非同期になりません。そのために、あなたが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を参照してください。

関連する問題