tornado服务如何对不同的handler设置非阻塞

发布于 2022-09-01 12:35:18 字数 293 浏览 13 评论 0

场景:

现在我自己写了一个tornado server,类似于一个反向代理,接受请求,制做成固定格式,发送给远程服务器,然后再将返回结果解析格式化返回给请求者。

一共有三个handler:a,b,c,分别要去请求不同的主机A,B,C,问题是A,B主机是单线程的,一次只能处理一个请求,而C主机可以扛并发。

问题:

我如何保证,handler c是异步非阻塞的,而a,b就让它阻塞运行。但这不仅仅是就把c做成非阻塞这么简单。关键是a,b在执行的时候,不会阻塞c,只会阻塞它们自己那种handler。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

老街孤人 2022-09-08 12:35:18

如果你只有一个进程的话,那么很好办:用个全局变量记录一下已经有 handler 正在处理 a 或者 b,然后当 a 和 b 接收到新请求时看看是不是正在处理另一个请求,如果是,等待几秒再看看。

另外注意 handler 别拼错了。

丶视觉 2022-09-08 12:35:18

a、b是否是阻塞式应答,其实和tornado的异步或者阻塞式调用是无关的。

你都使用AsyncHTTP + @gen.coroutine来调用a、b、c任意一个服务就好,只要这3个http调用没有相互依赖关系既可。

这是一个例子:

@gen.coroutine
def post(self):
    client = AsyncHTTPClient()
    resp = yield client.fetch("https://api.github.com/users")
    if resp.code == 200:
        body = escape.json_decode(resp.body)
    else:
        body = {"message": "client fetch error"}
        logger.error("client fetch error %d, %s" % (resp.code, resp.message))
    self.write(escape.json_encode(body))
    self.finish()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文