为了账号安全,请及时绑定邮箱和手机立即绑定

tornado 异步阻塞问题

tornado 异步阻塞问题

幕布斯7119047 2018-10-10 13:39:50
import os import time import tornado.webfrom tornado import gen from . import BaseHandlerclass RegisterHandler(BaseHandler):    def get(self):        self.render_html('register.html')    @tornado.web.asynchronous    @gen.coroutine    def post(self):        username = self.get_argument('username', None)        email = self.get_argument('email', None)        password = self.get_argument('password')        data = {'username': username, 'email': email, 'password': password,                 'timestamp': time.time()}        if username and email:            time.sleep(10)                yield self.db.user.insert(data)        self.redirect('/')class LoginHandler(BaseHandler):    def get(self):        self.render_html('login.html')我在注册的时候用time.sleep(10)阻塞了10秒, 按理说我通过异步的方式在这段阻塞的时间内是可以通过,浏览器访问我的login页面,但却同样被阻塞了。怎么解决这个问题还是我的代码有问题?
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

因为tornado是单线程的,你sleep了10秒,当然会把你的页面阻塞掉。
gen.sleep才是你要的

查看完整回答
反对 回复 2018-10-28
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

题主对异步的理解有偏差。

目测你是像模拟注册写数据的时候10s耗时间的操作。这个过程是异步的,不会影响tornaod处理别的请求。

问题在于 time.sleep这个模拟不正确,这句代码的含义就是整个 tornado 服务(单进程单线程)sleep,10s.
10s之后再接着处理请求。

另外,tornado yeild 这种是协程,是指多个并发请求的时候,其中一个耗时的请求不会阻塞其他的请求。不是只单个请求马上返回,使用callback的方式可以单个请求马上返回。


查看完整回答
反对 回复 2018-10-28
  • 2 回答
  • 0 关注
  • 842 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信