关于 tornado 阻塞的问题

2015-10-15 16:11:43 +08:00
 dai269619118
def get(self):
    time.sleep(100)
    self.write('hello test')

如果程序执行的时候中间处理一个需要很多时间,这个时候有一个新的请求
那么第二个请求需要等待第一个请求执行完才开始执行第二个操作
接着用 nginx 做了一个负载均衡,开了 3 个 tornado

upstream to.com{
        server 127.0.0.1:8887;
        server 127.0.0.1:8888;
        server 127.0.0.1:8889;
    }

可是中间还是有机率切到同一个端口上面,然后又要等待处理,有什么其他处理方面吗?

7498 次点击
所在节点    Tornado
22 条回复
sujin190
2015-10-19 00:30:05 +08:00
@wy315700 正常使用 mysql 上百万数据,有索引也得十几到几十毫秒才能返回,不用异步的话,这期间 tornado 就什么也不能做了
say2old
2015-11-20 09:55:01 +08:00
Tornado 官网上说的很清楚:

To minimize the cost of concurrent connections, Tornado uses a single-threaded event loop. This means that all application code should aim to be asynchronous and non-blocking because only one operation can be active at a time.

这个框架本质是在一个线程里做 event loop ( while True: blahblah 那种),所有的请求一个接一个处理。确保你的每一个请求都是轻量级的操作或者异步操作,不堵塞后面的请求。你的 sleep 相当于是一个长时间的堵塞请求,正确用法是启动另一个线程或者进程进行处理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228298

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX