Flask останавливается во время нагрузки
Запустил простой скрипт на удалённом Linux-сервере.
import json
from flask import Flask, Response, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def projects():
response = request.get_json()
return Response(json.dumps(response, ensure_ascii=False), mimetype='application/json')
app.run(host='92.53.***.***', port=443, ssl_context='adhoc')
Решил специально нагрузить сервер со своего компьютера, чтобы узнать потребление ресурсов сервера. На ПК запустил следующий код:
import requests
from threading import Thread
json = {
'token': 'ogu3hgo3hgo23ghupgcvno5pycteitetugl4cmtgheuehu3wghhjyjesjhtjhsthjr'
}
def i():
response = requests.post('https://92.53.***.***:443/', json=json, verify=False)
print(response.json())
while True:
Thread(target=i).start()
Примерно через 30 секунд сервер перестаёт отвечать, но скрипт не останавливается. Продолжает выполнение, но без логов и ответов. На пк появляется ошибка
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='92.53..', port=443): Max retries exceeded with url: /
Ответы (2 шт):
Flask в "соло" не предназначен для больших нагрузок.
Могу предложить использовать библиотеку Quart вместо Flask, а также использовать Gunicorn как веб сервер приложения.
Т.Е. связки вида:
- Gunicorn - Flask
- Gunicorn - Quart
Это позволит сделать работу под нагрузкой несколько стабильнее
Кроме уже сказанного, вы ведь фактически устроили своему серверу DoS-атаку. Вы бесконечно создаёте новые треды, делаете им start, но совсем не делаете join, в результате у вас запускается практически одновременно бесконечное число запросов (ну, там есть ограничения, но в данном случае это несущественно). С таким потоком запросов даже многопоточные сервера могут не справиться. Что уж говорить про простенький Flask, который выполняет запросы в режиме по одному. Естественно, пока он выполняет один запрос, остальная толпа запросов стоит в очереди и через какое-то время эта необработанная толпа начнёт отваливаться, не дождавшись ответа.
Делайте хоть какое-то ограничение на одновременное количество запросов, паузы между ними и т.д., иначе это получается очень суровый тест, для очень продвинутого веб-хостинга.