在其他测试中,我最终进行了以下测试:在 Python Bottle 服务器和带有 JS 的浏览器客户端之间每秒仅触发并处理 20 个 HTTP 请求。
为什么它无法成功处理每秒 20 个请求(在普通 i5 计算机上):以下代码是否存在已知瓶颈?
import bottle, time
app = bottle.Bottle()
@bottle.route('/')
def index():
return """<script>
var i = 0;
setInterval(() => {
i += 1;
let i2 = i;
console.log("sending request", i2);
fetch("/data")
.then((r) => r.text())
.then((arr) => {
console.log("finished processing", i2);
});
}, 100);
</script>"""
@bottle.route('/data')
def data():
return "abcd"
bottle.run(port=80)
sending request 1
sending request 2
sending request 3
sending request 4
finished processing 1
sending request 5
sending request 6
sending request 7
finished processing 2
sending request 8
sending request 9
sending request 10
finished processing 3
sending request 11
sending request 12
sending request 13
finished processing 4
sending request 14
sending request 15
sending request 16
finished processing 5
sending request 17
sending request 18
sending request 19
...
为什么已经是第 19 号请求,而我们只处理完第 5 个请求?
每个请求会丢失 50 毫秒,导致程序无法保持正常速度:
sending request 1
finished processing 1
sending request 2
finished processing 2
sending request 3
finished processing 3
?
gevent
使您的代码按预期运行。仅使用 gevent 的猴子补丁功能,无需异步重写:
from gevent import monkey
monkey.patch_all()
import bottle
app = bottle.Bottle()
@bottle.route('/')
def index():
return """<script>
var i = 0;
setInterval(() => {
i += 1;
let i2 = i;
console.log("sending request", i2);
fetch("/data")
.then((r) => r.text())
.then((arr) => {
console.log("finished processing", i2);
});
}, 100);
</script>"""
@bottle.route('/data')
def data():
return "abcd"
bottle.run(host='0.0.0.0', port=80, server='gevent')
浏览器控制台输出:
sending request 158
(index):10 finished processing 158
(index):6 sending request 159
(index):10 finished processing 159
(index):6 sending request 160
(index):10 finished processing 160
(index):6 sending request 161
(index):10 finished processing 161
(index):6 sending request 162
(index):10 finished processing 162
(index):6 sending request 163
(index):10 finished processing 163
(index):6 sending request 164
(index):10 finished processing 164
(index):6 sending request 165
(index):10 finished processing 165
(index):6 sending request 166