add graceful shutdown
This commit is contained in:
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
- add graceful shutdown
|
||||||
- add timeout monitoring for received packets
|
- add timeout monitoring for received packets
|
||||||
- parse Modbus values and store them in the database
|
- parse Modbus values and store them in the database
|
||||||
- add cron task to request the output power every minute
|
- add cron task to request the output power every minute
|
||||||
|
|||||||
@@ -90,11 +90,15 @@ class AsyncStream():
|
|||||||
f"{traceback.format_exc()}")
|
f"{traceback.format_exc()}")
|
||||||
|
|
||||||
async def disc(self) -> None:
|
async def disc(self) -> None:
|
||||||
|
if self.writer.is_closing():
|
||||||
|
return
|
||||||
logger.debug(f'AsyncStream.disc() l{self.l_addr} | r{self.r_addr}')
|
logger.debug(f'AsyncStream.disc() l{self.l_addr} | r{self.r_addr}')
|
||||||
self.writer.close()
|
self.writer.close()
|
||||||
await self.writer.wait_closed()
|
await self.writer.wait_closed()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
if self.writer.is_closing():
|
||||||
|
return
|
||||||
logger.debug(f'AsyncStream.close() l{self.l_addr} | r{self.r_addr}')
|
logger.debug(f'AsyncStream.close() l{self.l_addr} | r{self.r_addr}')
|
||||||
self.writer.close()
|
self.writer.close()
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
import asyncio
|
import asyncio
|
||||||
import signal
|
import signal
|
||||||
import functools
|
|
||||||
import os
|
import os
|
||||||
from logging import config # noqa F401
|
from logging import config # noqa F401
|
||||||
from messages import Message
|
from messages import Message
|
||||||
@@ -26,13 +25,23 @@ async def handle_client_v2(reader, writer):
|
|||||||
await InverterG3P(reader, writer, addr).server_loop(addr)
|
await InverterG3P(reader, writer, addr).server_loop(addr)
|
||||||
|
|
||||||
|
|
||||||
def handle_SIGTERM(loop):
|
async def handle_shutdown(loop):
|
||||||
'''Close all TCP connections and stop the event loop'''
|
'''Close all TCP connections and stop the event loop'''
|
||||||
|
|
||||||
logging.info('Shutdown due to SIGTERM')
|
logging.info('Shutdown due to SIGTERM')
|
||||||
|
|
||||||
#
|
#
|
||||||
# first, close all open TCP connections
|
# first, disc all open TCP connections gracefully
|
||||||
|
#
|
||||||
|
for stream in Message:
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for(stream.disc(), 2)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
logging.info('Disconnecting done')
|
||||||
|
|
||||||
|
#
|
||||||
|
# second, close all open TCP connections
|
||||||
#
|
#
|
||||||
for stream in Message:
|
for stream in Message:
|
||||||
stream.close()
|
stream.close()
|
||||||
@@ -91,7 +100,8 @@ if __name__ == "__main__":
|
|||||||
#
|
#
|
||||||
for signame in ('SIGINT', 'SIGTERM'):
|
for signame in ('SIGINT', 'SIGTERM'):
|
||||||
loop.add_signal_handler(getattr(signal, signame),
|
loop.add_signal_handler(getattr(signal, signame),
|
||||||
functools.partial(handle_SIGTERM, loop))
|
lambda loop=loop: asyncio.create_task(
|
||||||
|
handle_shutdown(loop)))
|
||||||
|
|
||||||
#
|
#
|
||||||
# Create taska for our listening servera. These must be tasks! If we call
|
# Create taska for our listening servera. These must be tasks! If we call
|
||||||
|
|||||||
Reference in New Issue
Block a user