Я создаю приложение flask и запускаю его на Gunicorn, но когда я использую модуль Python requests, время ожидания истекает. Вот минимальный воспроизводимый пример:
from flask import Flask
import requests
API_URL = "http://127.0.0.1:8000"
def create_app():
app = Flask(__name__)
@app.route('/')
def index():
response = requests.get(API_URL + "/test")
return response
@app.route('/test')
def test():
return "test"
return app
Я запускаю код с помощью gunicorn "app.main:create_app()". Когда я просто меняю функцию index на простой возврат текста, она работает без проблем. Однако, когда я запускаю его с помощью Gunicorn, я получаю ошибку
[2024-04-06 11:04:54 -0400] [45422] [INFO] Starting gunicorn 20.0.4
[2024-04-06 11:04:54 -0400] [45422] [INFO] Listening at: http://127.0.0.1:8000 (45422)
[2024-04-06 11:04:54 -0400] [45422] [INFO] Using worker: sync
[2024-04-06 11:04:54 -0400] [45423] [INFO] Booting worker with pid: 45423
[2024-04-06 11:05:28 -0400] [45422] [CRITICAL] WORKER TIMEOUT (pid:45423)
[2024-04-06 11:05:28 -0400] [45423] [INFO] Worker exiting (pid: 45423)
[2024-04-06 11:05:28 -0400] [45436] [INFO] Booting worker with pid: 45436
По истечении таймаута вызывается маршрут /test. Кто-нибудь знает, почему это так? Спасибо!
В общем, я попытался вызвать локальную конечную точку /test с помощью Python requests. Я ожидал, что оно мгновенно пройдет и вернется "test". Вместо этого он дал мне ошибку тайм-аута выше.
Интересно, а вы не знаете, связана ли эта проблема конкретно с ружьем? Например, разрешает ли он ответ requests.get, как ожидалось, без пушки в локальной настройке?
@PatrickYoder Я почти уверен. Когда я запускаю приложение flask, добавляя app = create_app() и app.run(debug=True) в часть __name__ == mainmain.py, а затем вызывая python3 app/main.py, вызов проходит, как и ожидалось.



Проблема не в requests с gunicorn. Если вы измените URL-адрес на внешний сервер, то, вероятно, он будет работать, а не тайм-аут.
Проблема здесь в том, что когда вы запускаете Gunicorn, по умолчанию он использует только 1 работника. Итак, происходит следующее: когда вы делаете запрос к http://127.0.0.1:8000/ (индексу), рабочий будет обрабатывать этот запрос, и у него не останется рабочих для обработки новых запросов, пока он не завершится, но поскольку внутри index() вы делаете запрос к своему серверу, рабочий будет попытайтесь сделать запрос самому себе, но не будет доступных исполнителей для обработки этого нового запроса, что приведет к тупику.
Чтобы это исправить, попробуйте запустить Gunicorn с более чем 1 рабочим. gunicorn --workers 2 "app.main:create_app()"
@PatrickYoder Спасибо за ответ, но когда я изменил его на возврат
response.textили даже когда я вернул строку, но только что позвонилrequests.get(API_URL + "/test"), время ожидания все равно истекло. Ты знаешь почему?