summaryrefslogtreecommitdiff
path: root/dots_manager/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'dots_manager/utils.py')
-rw-r--r--dots_manager/utils.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/dots_manager/utils.py b/dots_manager/utils.py
index e8210cc..1b900f0 100644
--- a/dots_manager/utils.py
+++ b/dots_manager/utils.py
@@ -1,8 +1,11 @@
-from typing import Callable, Optional, TypeVar, Tuple, ParamSpec, Dict, Any
+import logging
+from typing import Callable, Optional, TypeVar, Tuple, ParamSpec, Dict, Any, List
+from concurrent.futures import ThreadPoolExecutor, as_completed
from functools import reduce
P = ParamSpec("P")
T = TypeVar("T")
+R = TypeVar("R")
def is_some(
@@ -23,3 +26,19 @@ def merge_dicts(*dicts: Dict[str, Any]) -> Dict[str, Any]:
return out
return reduce(merge, dicts, {})
+
+
+def parallelize(
+ worker: Callable[[T], R],
+ items: List[T],
+ logger: logging.Logger,
+ executor: Optional[ThreadPoolExecutor] = None,
+) -> List[R]:
+ if executor is None:
+ from dots_manager.config import Constants
+
+ executor = ThreadPoolExecutor(max_workers=Constants.max_workers)
+ with executor as exec:
+ futures = [exec.submit(worker, item) for item in items]
+ logger.info(f"submitted {len(futures)} tasks to executor <_mood.excited>")
+ return [f.result() for f in as_completed(futures)]