From d8dd7c2c5e1d004f1cc9a60cef9bb2e267f5ed1e Mon Sep 17 00:00:00 2001 From: Stef Date: Fri, 29 Aug 2025 22:36:35 +0200 Subject: [PATCH] Made polling services async --- main.py | 6 ++++-- mem/__init__.py | 3 +++ poll_services.py | 55 +++++++++++++++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/main.py b/main.py index 39765ec..65b27e8 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ # import requests as r from flask import jsonify, Flask -from poll_services import update_services +from poll_services import start_async_loop from mem import services import threading @@ -16,7 +16,9 @@ def status(): # Only run if directly running file if __name__ == "__main__": - threading.Thread(target=update_services, daemon=True).start() + + t = threading.Thread(target=start_async_loop, daemon=True) + t.start() # Run flask app app.run(debug=True, use_reloader=False) diff --git a/mem/__init__.py b/mem/__init__.py index 6475b0a..d74205c 100644 --- a/mem/__init__.py +++ b/mem/__init__.py @@ -25,6 +25,9 @@ class service: def set_status(self, status: int): self.status = status + def set_online(self, b: bool): + self.online = b + services: list[service] = [ service("https://git.ihatemen.uk"), diff --git a/poll_services.py b/poll_services.py index d30ad04..4460011 100644 --- a/poll_services.py +++ b/poll_services.py @@ -1,24 +1,41 @@ -from mem import services -import requests +from mem import services, service +import httpx import urllib3 -import time +import asyncio urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) -def update_services() -> None: - print("Updating Service Status") - while True: - for s in services: - try: - r = requests.head( - url=s.url, - verify=s.public, - allow_redirects=True, - timeout=1, - ) - s.set_status(r.ok) - except requests.exceptions.RequestException as e: - print(e) - s.set_status(False) - time.sleep(3) +async def check_service(client: httpx.AsyncClient, s: service): + try: + r = await client.head( + url=s.url, + follow_redirects=True, + timeout=1, + ) + print(r.status_code) + s.set_online(r.status_code == 200) + except httpx.RequestError as e: + print(e) + s.set_online(False) + + +def start_async_loop(): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + asyncio.run_coroutine_threadsafe(update_services(loop=loop), loop=loop) + loop.run_forever() + + +async def update_services(loop: asyncio.AbstractEventLoop): + print("Starting service updates...") + async with httpx.AsyncClient() as public_client, httpx.AsyncClient( + verify=False + ) as local_client: + while True: + tasks = [ + check_service(public_client if s.public else local_client, s) + for s in services + ] + await asyncio.gather(*tasks) + await asyncio.sleep(2)