File size: 1,490 Bytes
536551b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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)