malavikapradeep2001's picture
Deploy Pathora Viewer: tile server, viewer components, and root app.py
fc6a9fa verified
raw
history blame
1.49 kB
from collections import OrderedDict
from threading import Lock
from typing import Dict, Optional
import openslide
class SlideCache:
def __init__(self, max_items: int = 8) -> None:
self._max_items = max_items
self._slides: Dict[str, openslide.OpenSlide] = OrderedDict()
self._lock = Lock()
def get(self, slide_id: str) -> Optional[openslide.OpenSlide]:
with self._lock:
slide = self._slides.get(slide_id)
if slide is None:
return None
self._slides.move_to_end(slide_id)
return slide
def put(self, slide_id: str, path: str) -> openslide.OpenSlide:
with self._lock:
if slide_id in self._slides:
self._slides.move_to_end(slide_id)
return self._slides[slide_id]
slide = openslide.OpenSlide(path)
self._slides[slide_id] = slide
self._slides.move_to_end(slide_id)
while len(self._slides) > self._max_items:
_, oldest = self._slides.popitem(last=False)
try:
oldest.close()
except Exception:
pass
return slide
cache = SlideCache()
def load_slide(slide_id: str, path: str) -> openslide.OpenSlide:
return cache.put(slide_id, path)
def get_slide(slide_id: str) -> Optional[openslide.OpenSlide]:
return cache.get(slide_id)