minor improvements to the bg worker
This commit is contained in:
parent
49ac2720ac
commit
caf60333ea
1 changed files with 9 additions and 4 deletions
|
|
@ -6,10 +6,16 @@ from queue import Empty, Queue
|
||||||
|
|
||||||
from .Singleton import Singleton
|
from .Singleton import Singleton
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG: logging.Logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class BackgroundWorker(metaclass=Singleton):
|
class BackgroundWorker(metaclass=Singleton):
|
||||||
|
"""
|
||||||
|
Background worker to run tasks in a separate thread.
|
||||||
|
This class uses a queue to submit tasks that will be executed in the background.
|
||||||
|
It is designed to run in a separate thread and uses asyncio to handle asynchronous tasks.
|
||||||
|
"""
|
||||||
|
|
||||||
_instance = None
|
_instance = None
|
||||||
"""The instance of the Notification class."""
|
"""The instance of the Notification class."""
|
||||||
|
|
||||||
|
|
@ -37,19 +43,18 @@ class BackgroundWorker(metaclass=Singleton):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.exception("Loop error: %s", e)
|
LOG.exception("Loop error: %s", e)
|
||||||
|
|
||||||
threading.Thread(target=_loop_runner, daemon=True).start()
|
threading.Thread(target=_loop_runner, daemon=True, name="Background Runner").start()
|
||||||
|
|
||||||
while self.running:
|
while self.running:
|
||||||
try:
|
try:
|
||||||
fn, args, kwargs = self.queue.get(timeout=1)
|
fn, args, kwargs = self.queue.get(timeout=1)
|
||||||
try:
|
try:
|
||||||
LOG.debug("Running background task: %s", fn.__name__)
|
|
||||||
result = fn(*args, **kwargs)
|
result = fn(*args, **kwargs)
|
||||||
if inspect.iscoroutine(result):
|
if inspect.iscoroutine(result):
|
||||||
loop.call_soon_threadsafe(loop.create_task, result)
|
loop.call_soon_threadsafe(loop.create_task, result)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.exception(e)
|
LOG.exception(e)
|
||||||
LOG.error(f"Error in background task: {fn.__name__}")
|
LOG.error(f"Failed to run '{fn.__name__}'. {e!s}")
|
||||||
except Empty:
|
except Empty:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue