tornado 异步得到结果后write报错Cannot write() after finish()

在使用Tornado进行异步非阻塞编程时遇到RuntimeError,提示不能在finish()后写入。问题源于不当的请求处理。解决方案是使用`@gen.coroutine`装饰器,并确保在协程执行完毕后调用`self.finish()`。在最新的Tornado版本中,`@asyncio.coroutine`可以自动监听并调用完成,不再需要手动调用`finish()`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一.问题引入

二.代码

三.解决

四.后续

五.拓展:


一.问题引入

tornado 是一个很好的异步非阻塞Python框架,有着优秀的大并发处理能力,使用中出现如下错误:

raise RuntimeError("Cannot write() after finish()")

二.代码

以下是涉及的代码:

thread_pool = ThreadPoolExecutor(2)
def go():
    all = selected_customer_all()
    return all
class R_SelectionCustomer(MyBackStargeRequestHandler):
    @authenticated  # 需要身份认证才能访问的处理器
    #让一个请求一直保持 连接状态,而不是马上返回,直到一个主处理行为返回。
    @gen.coroutine
    def get(self):
        print("我R_SelectionCustomer被访问了")
        #self.get_argument()
        all = yield thread_pool.submit(go)
        self.write(str(RJ(data=all,total=len(all))))
       

三.解决

查阅资料:

        当一个处理请求的行为被执行之后,这个请求会自动地结束。因为 Tornado 当中使用了 一种非阻塞式的 I/O 模型,所以你可以改变这种默认的处理行为——让一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值