Python Bottle + Javascript fetch 每秒 20 个请求的瓶颈在哪里?

问题描述 投票:0回答:1

在其他测试中,我最终进行了以下测试:在 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

javascript python performance bottle
1个回答
1
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.