tornado 异步阻塞问题
import os
import time
import tornado.web
from tornado import gen
from . import BaseHandler
class 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
页面,但却同样被阻塞了。怎么解决这个问题还是我的代码有问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
题主对异步的理解有偏差。
目测你是像模拟注册写数据的时候10s耗时间的操作。这个过程是异步的,不会影响tornaod处理别的请求。
问题在于 time.sleep这个模拟不正确,这句代码的含义就是整个 tornado 服务(单进程单线程)sleep,10s.
10s之后再接着处理请求。
另外,tornado yeild 这种是协程,是指多个并发请求的时候,其中一个耗时的请求不会阻塞其他的请求。不是只单个请求马上返回,使用callback的方式可以单个请求马上返回。
因为tornado是单线程的,你sleep了10秒,当然会把你的页面阻塞掉。
gen.sleep才是你要的