Simple base interfaces.
authorScott Gasch <[email protected]>
Fri, 9 Jun 2023 01:38:07 +0000 (18:38 -0700)
committerScott Gasch <[email protected]>
Fri, 9 Jun 2023 01:38:07 +0000 (18:38 -0700)
src/pyutils/collectionz/shared_dict.py
src/pyutils/parallelize/thread_utils.py
src/pyutils/typez/typing.py

index dba30e505a172eddac2915334e8878342bbd5d95..e3324cb2d3c12fb67fa5e0bfb3d7c5df3502a234 100644 (file)
@@ -48,6 +48,8 @@ from typing import (
     ValuesView,
 )
 
+from pyutils.typez.typing import Closable
+
 
 class PickleSerializer:
     """A serializer that uses pickling.  Used to read/write bytes in the shared
@@ -71,7 +73,7 @@ class PickleSerializer:
 # whole thing?
 
 
-class SharedDict(object):
+class SharedDict(Closable):
     """This class emulates the dict container but uses a
     `Multiprocessing.SharedMemory` region to back the dict such that it
     can be read and written by multiple independent processes at the
index 43e6294cf2197b03e0cb6abf03f16e9f30729615..4e891f1d8b813a7d3624b17907790c038f26527f 100644 (file)
@@ -10,6 +10,8 @@ import os
 import threading
 from typing import Any, Callable, Optional, Tuple
 
+from pyutils.typez.typing import Runnable
+
 # This module is commonly used by others in here and should avoid
 # taking any unnecessary dependencies back on them.
 
@@ -132,7 +134,7 @@ def background_thread(
         return wrapper(_funct)
 
 
-class ThreadWithReturnValue(threading.Thread):
+class ThreadWithReturnValue(threading.Thread, Runnable):
     """A thread whose return value is plumbed back out as the return
     value of :meth:`join`.  Use like a normal thread::
 
index 18cf4efc3a8bb3873ed8aceae5ba3a0aa16f55fb..bed5e7fc34bf578f415948b35c5370aee815e24f 100644 (file)
@@ -28,3 +28,24 @@ class Comparable(Protocol):
     @abstractmethod
     def __eq__(self, other: Any) -> bool:
         ...
+
+
+class Closable(Protocol):
+    """Something that can be closed."""
+
+    def close(self) -> None:
+        ...
+
+
+class Cloneable(Protocol):
+    """Something that can be cloned."""
+
+    def clone(self) -> None:
+        ...
+
+
+class Runnable(Protocol):
+    """Something that can be run."""
+
+    def run(self) -> None:
+        ...