如何设置flask+uWSGI应用程序来超时长请求

2024-05-12 02:43:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个客户端和服务器设置(客户端是一个产品,不能更改,服务器是我们编码的,Python+Flask+uWSGI),其中客户端以10秒超时的速度快速发送HTTP请求。达到超时后,客户机将再重试3次,超时时间为10秒,但会有一些指数级的后退等待

尽管每个任务的处理速度都相当快,但由于发送了大量请求,任务在uWSGI队列中等待了10秒以上,然后在客户端超时。问题是,即使那些超时的任务最终也将由服务器处理,当您包括客户端重试时,一个任务最多可以处理4次(1个原始请求+3次重试)

有没有办法设置我的uWSGI服务器,使其超时所有未在10秒内处理的传入请求

我尝试了uWSGI的harakiri选项,但它杀死了整个过程,并且只有当它工作超过超时时才停止。我还尝试了python中的harakiri uWSGI decorator。 我在uWSGI文档中尝试了其他每一个超时选项,但没有任何效果

您可以使用以下代码复制此问题

client.py

import requests
import threading

def foo():
    while True:
        try:
            resp = requests.get("http://localhost:9090/", timeout=5)
            print("I made it!", resp.text)
        except Exception as e:
            print("DIDN'T make it.. error:", e)

threads = []
for i in range(5):
    t = threading.Thread(target=foo)
    t.daemon = True
    t.start()
    threads.append(t)

for t in threads:
    t.join()

server.py

import flask as fl
import time
import random

app = fl.Flask(__name__)

@app.route('/')
def index():
    t = random.randrange(1, 4)
    print("working for", str(t), "seconds...", end="")
    time.sleep(t)
    ident = random.randrange(1, 1000000)
    print("DONE WORKING, RETURNING RESULT!", "ID:", ident)
    return "I slept for " + str(t) + " seconds! ID: " + str(ident)

uwsgi.ini配置文件

[uwsgi]
http = :9090
wsgi-file = server.py
callable = app

master = true
processes = 2
strict = true
disable-logging = true

harakiri = 5
http-timeout = 4

服务器的输出如下所示:

working for  1  seconds...DONE WORKING, RETURNING RESULT!!! ID: 33021
working for  1  seconds...DONE WORKING, RETURNING RESULT!!! ID: 240084
working for  1  seconds...DONE WORKING, RETURNING RESULT!!! ID: 107112
working for  2  seconds...DONE WORKING, RETURNING RESULT!!! ID: 259223
working for  1  seconds...DONE WORKING, RETURNING RESULT!!! ID: 699282
working for  3  seconds...DONE WORKING, RETURNING RESULT!!! ID: 146855
working for  1  seconds...DONE WORKING, RETURNING RESULT!!! ID: 292973
working for  1  seconds...DONE WORKING, RETURNING RESULT!!! ID: 299534

客户端的输出从http超时参数抛出断开连接的错误,但服务器仍处理该请求:

I made it! I slept for 1 seconds! ID: 33021
I made it! I slept for 1 seconds! ID: 240084
I made it! I slept for 1 seconds! ID: 107112
I made it! I slept for 2 seconds! ID: 259223
DIDN'T make it.. error: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
I made it! I slept for 1 seconds! ID: 699282
I made it! I slept for 1 seconds! ID: 292973
I made it! I slept for 1 seconds! ID: 299534
I made it! I slept for 1 seconds! ID: 249919
DIDN'T make it.. error: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
I made it! I slept for 2 seconds! ID: 608657
DIDN'T make it.. error: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

谢谢大家!


Tags: import服务器id客户端foritresultuwsgi