gpt4 book ai didi

signals - gevent (py)wsgi 优雅关闭

转载 作者:行者123 更新时间:2023-12-01 15:02:15 24 4
gpt4 key购买 nike

我知道(通过搜索和检查 gevent 的源代码)优雅地关闭基于 gevent WSGI 的服务器的唯一方法是:

server = gevent.wsgi.WSGIServer(('', 80), someWSGIApp)
def shutdown():
print('Shutting down ...')
server.stop(timeout=60)
exit(signal.SIGTERM)
gevent.signal(signal.SIGTERM, shutdown)
server.serve_forever()

现在,我所说的优雅的意思是等待所有 greenlet 自行终止。因此,例如,如果他们仍在处理请求,他们可以正确地完成它们。

问题是,上面看似正确的代码,服务器确实等待最大。 60 秒,但所有 TCP 连接在收到 SIGTERM 后立即终止.然而,Greenlets 会继续做他们之前的事情(例如 sleep ),直到他们完成或超时发生。

有任何想法吗?

最佳答案

您可以通过在一个线程中运行服务器并在另一个线程中关闭它来解决该问题。下面的代码在 Python 3.7 中运行。

from gevent.pywsgi import WSGIServer
import signal
import threading

# define your app here
app = ...

server_address = ("localhost", 4000)


class WebServer(threading.Thread):
def __init__(self):
super().__init__()

def run(self):
global server
server = WSGIServer(server_address, app)
server.serve_forever()


def shutdown(num, info):
print(f'Shutting down website server...\n'
f'{num} {info}')
server.stop()
server.close()


if __name__ == "__main__":
server = None
WebServer().start()

signal.signal(signal.SIGINT, shutdown)

关于signals - gevent (py)wsgi 优雅关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com