我有一个客户端和服务器设置(客户端是一个产品,不能更改,服务器是我们编码的,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',))
谢谢大家!
uWSGI方面没有太多文档,但是,检查连接(来自客户端的请求)是否仍然“打开”有效吗
见https://uwsgi-docs.readthedocs.io/en/latest/PythonModule.html#uwsgi.is_connected
比如:
相关问题 更多 >
编程相关推荐