2019-07-08 21:04:26 +00:00
|
|
|
from functools import wraps
|
|
|
|
from threading import Lock, Thread
|
|
|
|
|
|
|
|
|
|
|
|
class ThreadsManager:
|
|
|
|
objects = {}
|
|
|
|
lock = Lock()
|
|
|
|
|
2022-09-29 16:13:22 +00:00
|
|
|
def __init__(self, name=None):
|
2020-06-01 08:31:36 +00:00
|
|
|
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)
|