python - Flask - 实现“服务器繁忙”
问题描述
我有一个 Flask 应用程序,客户端每 5 秒调用一次/process
路由,有时执行时间过长,有时则不需要。我使用了信号量,因此,这条路线一次只能访问一个。如果这条路由执行的时间很长,而在这段时间内,客户端打了电话,我不希望客户端一直等待,所以我会abort
。
只是为了模拟一些随机的执行时间,我正在使用sleep
方法,这将使程序从列表中随机选择的秒数休眠。我使用Semaphore
with1
作为限制,因此,该路由一次只能访问一个。而且,我正在使用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 应用程序,但这也不起作用。
请问有更新吗?
解决方案
推荐阅读
- wordpress - MVC 方式的 WordrPess 插件
- node.js - Node Cron 执行具体功能
- grails - 在 Grails 4 中使用 Micronaut HTTP 客户端进行参数编码
- mobile - 没有方法签名:静态 com.kms.katalon.core.testobject.ObjectRepository.findTestObject() 适用于参数类型:(java.lang.String,
- ios - iOS:是否可以以编程方式触发 LED 闪烁以发出警报?
- java - 如何在 Java Canvas 中绘制 JSON 文本?
- ios - 根据“if”语句发出警报
- python - 当函数在 Pandas 数据框中工作时,PySpark udf 返回 null
- excel - 如何在包含日期的 2 个先前单元格上启用基于 if-else 条件的条件格式?
- azure-media-services - Azure 媒体服务 V3 中的 WaterMark、徽标和缩略图