首页 > 解决方案 > Flask - 实现“服务器繁忙”

问题描述

我有一个 Flask 应用程序,客户端每 5 秒调用一次/process路由,有时执行时间过长,有时则不需要。我使用了信号量,因此,这条路线一次只能访问一个。如果这条路由执行的时间很长,而在这段时间内,客户端打了电话,我不希望客户端一直等待,所以我会abort

只是为了模拟一些随机的执行时间,我正在使用sleep方法,这将使程序从列表中随机选择的秒数休眠。我使用Semaphorewith1作为限制,因此,该路由一次只能访问一个。而且,我正在使用blocking=False选项获取资源,以便在资源释放之前不会阻塞客户端。下面是我的代码的样子:

应用程序.py

from flask import Flask, render_template, abort
from threading import Semaphore
import time
from random import choice


app = Flask(__name__)
sem = Semaphore(1)


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/process')
def process():
    if sem.acquire(blocking=False):
        random_sleep_list = [2, 5, 7]
        random_sleep_selected = choice(random_sleep_list)
        print('Random Sleep: ', random_sleep_selected)
        time.sleep(random_sleep_selected)
        sem.release()
        return 'Done'
    else:
        abort(503)


if __name__ == '__main__':
    app.run()

索引.html

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $(document).ready(function() {
        setInterval(function() {
            console.log('Start')
            $.get('/process', function(data) {
                console.log(data);
            }).fail(function() {
                alert('Server busy!');
            });
        }, 5000);
    });
</script>

上面的代码不能正常工作,如果/process路由执行时间长,客户端调用,客户端一直在等待,其实不应该,因为信号量已经获取到资源,会释放只有当随机选择的秒数完成时。

我想知道,当路由忙时,是否有任何 Flask 的内置方法或装饰器说“服务器忙”或类似的东西。或者这可以通过对我的代码进行少量修改来完成。让我知道,我做错了什么,以及如何解决。

提前致谢!

注意:我尝试使用threaded=True选项启动 Flask 应用程序,但这也不起作用。


请问有更新吗?

标签: pythonmultithreadingflaskserversemaphore

解决方案


推荐阅读