add graceful_shutdown_timeout
This commit is contained in:
parent
e18ebaee3d
commit
5c19eb34bf
|
@ -395,7 +395,7 @@ def serve(host, port, request_handler, error_handler, before_start=None,
|
||||||
register_sys_signals=True, run_async=False, connections=None,
|
register_sys_signals=True, run_async=False, connections=None,
|
||||||
signal=Signal(), request_class=None, has_log=True, keep_alive=True,
|
signal=Signal(), request_class=None, has_log=True, keep_alive=True,
|
||||||
is_request_stream=False, router=None, websocket_max_size=None,
|
is_request_stream=False, router=None, websocket_max_size=None,
|
||||||
websocket_max_queue=None, state=None):
|
websocket_max_queue=None, state=None, graceful_shutdown_timeout=15.0):
|
||||||
"""Start asynchronous HTTP Server on an individual process.
|
"""Start asynchronous HTTP Server on an individual process.
|
||||||
|
|
||||||
:param host: Address to host on
|
:param host: Address to host on
|
||||||
|
@ -507,8 +507,26 @@ def serve(host, port, request_handler, error_handler, before_start=None,
|
||||||
for connection in connections:
|
for connection in connections:
|
||||||
connection.close_if_idle()
|
connection.close_if_idle()
|
||||||
|
|
||||||
while connections:
|
# Gracefully shutdown timeout.
|
||||||
|
# We should provide graceful_shutdown_timeout,
|
||||||
|
# instead of letting connection hangs forever.
|
||||||
|
# Let's roughly calcucate time.
|
||||||
|
start_shutdown = 0
|
||||||
|
while connections and (start_shutdown < graceful_shutdown_timeout):
|
||||||
loop.run_until_complete(asyncio.sleep(0.1))
|
loop.run_until_complete(asyncio.sleep(0.1))
|
||||||
|
start_shutdown = start_shutdown + 0.1
|
||||||
|
|
||||||
|
# Force close non-idle connection after waiting for
|
||||||
|
# graceful_shutdown_timeout
|
||||||
|
coros = []
|
||||||
|
for conn in connections:
|
||||||
|
if hasattr(conn, "websocket") and conn.websocket:
|
||||||
|
coros.append(conn.websocket.close_connection(force=True))
|
||||||
|
else:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
_shutdown = asyncio.gather(*coros, loop=loop)
|
||||||
|
loop.run_until_complete(_shutdown)
|
||||||
|
|
||||||
trigger_events(after_stop, loop)
|
trigger_events(after_stop, loop)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user