|
6 | 6 | @date:2023/10/23 16:03 |
7 | 7 | @desc: |
8 | 8 | """ |
| 9 | + |
9 | 10 | import threading |
10 | 11 | import time |
11 | 12 |
|
12 | 13 | from common.cache.mem_cache import MemCache |
13 | 14 |
|
14 | | -lock = threading.Lock() |
| 15 | +_lock = threading.Lock() |
| 16 | +locks = {} |
15 | 17 |
|
16 | 18 |
|
17 | 19 | class ModelManage: |
18 | 20 | cache = MemCache('model', {}) |
19 | 21 | up_clear_time = time.time() |
20 | 22 |
|
| 23 | + @staticmethod |
| 24 | + def _get_lock(_id): |
| 25 | + lock = locks.get(_id) |
| 26 | + if lock is None: |
| 27 | + with _lock: |
| 28 | + lock = locks.get(_id) |
| 29 | + if lock is None: |
| 30 | + lock = threading.Lock() |
| 31 | + locks[_id] = lock |
| 32 | + |
| 33 | + return lock |
| 34 | + |
21 | 35 | @staticmethod |
22 | 36 | def get_model(_id, get_model): |
23 | | - # 获取锁 |
24 | | - lock.acquire() |
25 | | - try: |
26 | | - model_instance = ModelManage.cache.get(_id) |
27 | | - if model_instance is None or not model_instance.is_cache_model(): |
| 37 | + model_instance = ModelManage.cache.get(_id) |
| 38 | + if model_instance is None: |
| 39 | + lock = ModelManage._get_lock(_id) |
| 40 | + with lock: |
| 41 | + model_instance = ModelManage.cache.get(_id) |
| 42 | + if model_instance is None: |
| 43 | + model_instance = get_model(_id) |
| 44 | + ModelManage.cache.set(_id, model_instance, timeout=60 * 60 * 8) |
| 45 | + else: |
| 46 | + if model_instance.is_cache_model(): |
| 47 | + ModelManage.cache.touch(_id, timeout=60 * 60 * 8) |
| 48 | + else: |
28 | 49 | model_instance = get_model(_id) |
29 | | - ModelManage.cache.set(_id, model_instance, timeout=60 * 30) |
30 | | - return model_instance |
31 | | - # 续期 |
32 | | - ModelManage.cache.touch(_id, timeout=60 * 30) |
33 | | - ModelManage.clear_timeout_cache() |
34 | | - return model_instance |
35 | | - finally: |
36 | | - # 释放锁 |
37 | | - lock.release() |
| 50 | + ModelManage.cache.set(_id, model_instance, timeout=60 * 60 * 8) |
| 51 | + ModelManage.clear_timeout_cache() |
| 52 | + return model_instance |
38 | 53 |
|
39 | 54 | @staticmethod |
40 | 55 | def clear_timeout_cache(): |
41 | | - if time.time() - ModelManage.up_clear_time > 60: |
42 | | - ModelManage.cache.clear_timeout_data() |
| 56 | + if time.time() - ModelManage.up_clear_time > 60 * 60: |
| 57 | + threading.Thread(target=lambda: ModelManage.cache.clear_timeout_data()).start() |
| 58 | + ModelManage.up_clear_time = time.time() |
43 | 59 |
|
44 | 60 | @staticmethod |
45 | 61 | def delete_key(_id): |
|
0 commit comments