我正在创建一个 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"
。相反,它给了我上面的超时错误。
问题不在于
requests
与gunicorn
。如果您将 URL 更改为外部服务器,那么它可能会正常工作并且不会超时。
这里的问题是,当你运行gunicorn时,默认情况下它只使用1个worker。所以发生的情况是,当您向
http://127.0.0.1:8000/
(索引)发出请求时,工作人员将处理该请求,并且在完成之前没有工作人员可以处理新请求,但因为在 index()
内部,您正在向服务器发出请求,工作人员将尝试向自己发出请求,但不会有工作人员可以处理该新请求,从而造成死锁。
要修复此问题,请尝试使用超过 1 个工作线程运行 Gunicorn。
gunicorn --workers 2 "app.main:create_app()"