когда ты не знаешь что будет в словаре, чего не будет.
У тебя при абсолютно любой ошибке отправки пользователь молча помечается как неактивный, даже если это какой-то несвязанный твой косяк.
async def serve_one():
conn = await aiomysql.connect() # нужно использовать асинхронные библиотеки!
...
await asyncio.sleep(3) # не time.sleep()! asyncio.sleep() позволяет выполняться "соседним" задачам
ip = await aiohttp.get('http://localhost/') # см. выше про библиотеки
...
# ну и так далее
async def serve_all():
for i in iter(int, 1):
await serve_one()
serve_task = None
async def monitor(): # а вот эта корутина будет висеть и тихонько мониторить признак остановки.
global serve_task # вместо global'ов можно отрефакторить на класс, суть не меняется.
while not stop_requested: # спим, пока нас не попросят остановиться.
await asyncio.sleep(0.5)
serve_task.cancel() # сигнализируем, что нужно прервать главную задачу.
# это спровоцирует исключение asyncio.CancelledError в текущем await-вызове внутри задачи.
async def main():
global serve_task
serve_task = asyncio.create_task(serve_all()) # запускаем serve_all() "параллельно" себе
monitor = asyncio.create_task(monitor()) # запускаем monitor() "параллельно" себе
try:
await serve_task # ждём завершения serve_all()
except asyncio.CancelledError:
pass # задача была прервана, но мы этого и ожидали
if __name__ == '__main__':
asyncio.run(main())