python - tornado 异步阻塞问题
怪我咯
怪我咯 2017-04-17 14:55:16
[Python讨论组]
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页面,但却同样被阻塞了。怎么解决这个问题还是我的代码有问题?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
PHPz

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

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

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

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

黄舟

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号