From 55f3e236c0356cb25e4388064a273f6874db9117 Mon Sep 17 00:00:00 2001 From: tpietzsch Date: Mon, 22 Apr 2024 10:52:18 +0200 Subject: [PATCH] Deserialize appose_type "shm" and "ndarray" --- src/appose/types.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/appose/types.py b/src/appose/types.py index 803f642..4c83b3c 100644 --- a/src/appose/types.py +++ b/src/appose/types.py @@ -29,6 +29,7 @@ import json from typing import Any, Dict +from multiprocessing import shared_memory Args = Dict[str, Any] @@ -38,4 +39,34 @@ def encode(data: Args) -> str: def decode(the_json: str) -> Args: - return json.loads(the_json) + return json.loads(the_json, object_hook=_appose_object_hook) + + +class ShmNDArray: + + def __init__(self, shm: shared_memory.SharedMemory, dtype: str, shape ): + self.shm = shm + self.dtype = dtype + self.shape = shape + + def __str__(self): + return f"ShmNDArray(shm='{self.shm.name}' ({self.shm.size}), dtype='{self.dtype}', shape={self.shape})" + + def ndarray(self): + try: + import math + import numpy + num_elements = math.prod(self.shape) + return numpy.ndarray(num_elements, dtype=self.dtype, buffer=self.shm.buf).reshape(self.shape) + except ModuleNotFoundError: + raise ImportError("NumPy is not available.") + + +def _appose_object_hook(obj: Dict): + type = obj.get('appose_type') + if type == 'shm': + return shared_memory.SharedMemory(name=(obj['name']), size=(obj['size'])) + elif type == 'ndarray': + return ShmNDArray(obj['shm'], obj['dtype'], obj['shape']) + else: + return obj