【问题标题】:How to make Tornado server side really async如何使 Tornado 服务器端真正异步
【发布时间】:2015-08-20 12:01:52
【问题描述】:

我开始了一个长的基于文件的数据库搜索,它应该运行异步并让浏览器端单独处理其他请求,但它似乎阻塞了。有什么问题?

class Handler(tornado.web.RequestHandler):

    def initialize(self, param):
        self.db = param

    @tornado.web.asynchronous
    @gen.engine
    def post(self):
        try:
            self.set_status(200)
            response = yield gen.Task(self.handleSearch, self.request.arguments)
            self.finish(response)
        except BaseException, s:
            logging.exception(s)
            self.finish("Error tonight, cause: %s" % s)

    def handleSearch(self, request, callback):
        return callback(self.db.createList(request))

【问题讨论】:

  • 这是什么意思,“让浏览器端不管[..],但它似乎阻止了”?!
  • 我有一个 html 页面,可以向服务器发送多个请求(例如通过按钮)。当搜索查询运行时,该页面的其余部分(例如通过其他按钮的请求)应该可以访问,
  • 那么发生了什么?你如何向服务器发送请求?如果 client 端 阻塞听起来更像 client 端 不是异步...!?
  • 一个html按钮调用如下函数 function search(event) { event.preventDefault() var data;数据 = $(".o").serialize(); $.post("seach",data,function(response) { document.getElementById("results").innerHTML = response } }); }
  • 请帮助:我怎样才能漂亮地打印输入到评论中的代码?

标签: python tornado


【解决方案1】:

为了使用tornado异步功能,你的函数也需要异步,否则就不是真正的异步

那里有一些用于龙卷风的库,check this out 用于库,但如果您没有找到所需的库,另一种解决方案是使用很棒的 future

所以在python中使用future你的代码会是这样的

from concurrent.futures import ThreadPoolExecutor

class Handler(tornado.web.RequestHandler):

    def initialize(self, param):
        self.db = param

    @gen.coroutine
    def post(self):
        self.set_status(200)
        with ThreadPoolExecutor(1) as execute:
            r = yield execute.submit(self.handleSearch, param=request.arguments)
            self.finish(r)

    def handleSearch(self, param):
        try:
            return self.db.createList(param) # or time.sleep(4) (sth which block)
        except Exception as e:
            return False

我已经对其进行了测试,它可以工作,它与龙卷风 100% 兼容,因此您不会遇到任何问题

【讨论】:

  • 如何将结果返回(或呈现)给网络客户端?
  • 它依赖于 tornado.web.RequestHandler,请阅读:tornado.readthedocs.org/en/latest/web.html#thread-safety-notes
  • 我试过 self,write() 但它不起作用,因为在 post() 结束时连接已关闭。问题仍然是:如何将结果发回。
  • 我的回答,很好地回答了你的问题,你在评论中所说的需要另一个问题,但为了完全起见,你可以使用异步超时来防止关闭连接,有很多超时使用stackoverflow 中的龙卷风或防止龙卷风自行关闭连接。只需稍作搜索即可完成工作
  • 感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多