在gunicorn上运行flask应用程序时python请求超时

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

我正在创建一个 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
路由被调用。有谁知道为什么会这样?谢谢!

总的来说,我尝试使用 python 的

/test
来调用本地
requests
端点。我期待它立即通过并返回
"test"
。相反,它给了我上面的超时错误。

flask python-requests gunicorn
1个回答
0
投票

问题不在于

requests
gunicorn
。如果您将 URL 更改为外部服务器,那么它可能会正常工作并且不会超时。

这里的问题是,当你运行gunicorn时,默认情况下它只使用1个worker。所以发生的情况是,当您向

http://127.0.0.1:8000/
(索引)发出请求时,工作人员将处理该请求,并且在完成之前没有工作人员可以处理新请求,但因为在
index()
内部,您正在向服务器发出请求,工作人员将尝试向自己发出请求,但不会有工作人员可以处理该新请求,从而造成死锁。

要修复此问题,请尝试使用超过 1 个工作线程运行 Gunicorn。

gunicorn --workers 2 "app.main:create_app()"

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