clearml-server/apiserver/utilities/threads_manager.py

40 lines
1.1 KiB
Python
Raw Normal View History

2019-07-08 21:04:26 +00:00
from functools import wraps
from threading import Lock, Thread
class ThreadsManager:
objects = {}
lock = Lock()
def __init__(self, name=None):
self.name = name or self.__class__.__name__
2019-12-14 21:35:18 +00:00
2019-07-08 21:04:26 +00:00
def register(self, thread_name, daemon=True):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
with self.lock:
thread = self.objects.get(thread_name)
if not thread:
thread = Thread(
2019-12-14 21:35:18 +00:00
target=f, name=f"{self.name}_{thread_name}", args=args, kwargs=kwargs
2019-07-08 21:04:26 +00:00
)
thread.daemon = daemon
thread.start()
self.objects[thread_name] = thread
return thread.ident
return wrapper
return decorator
2019-12-14 21:35:18 +00:00
def __getattr__(self, item):
if item in self.objects:
return self.objects[item]
return self.__getattribute__(item)
def __getitem__(self, item):
if item in self.objects:
return self.objects[item]
raise KeyError(item)