refactor(PluginMonitor): use rate_limit_window for rate limit

This commit is contained in:
InfinityPacer
2024-09-05 23:47:57 +08:00
parent 862f3cb623
commit 4493d4c62f
+4 -20
View File
@@ -3,8 +3,6 @@ import concurrent.futures
import importlib.util import importlib.util
import inspect import inspect
import os import os
import threading
import time
import traceback import traceback
from pathlib import Path from pathlib import Path
from typing import Any, Callable, Dict, List, Optional, Tuple, Union, Type from typing import Any, Callable, Dict, List, Optional, Tuple, Union, Type
@@ -21,8 +19,9 @@ from app.helper.module import ModuleHelper
from app.helper.plugin import PluginHelper from app.helper.plugin import PluginHelper
from app.helper.sites import SitesHelper from app.helper.sites import SitesHelper
from app.log import logger from app.log import logger
from app.utils.crypto import RSAUtils
from app.schemas.types import SystemConfigKey from app.schemas.types import SystemConfigKey
from app.utils.crypto import RSAUtils
from app.utils.limit import rate_limit_window
from app.utils.object import ObjectUtils from app.utils.object import ObjectUtils
from app.utils.singleton import Singleton from app.utils.singleton import Singleton
from app.utils.string import StringUtils from app.utils.string import StringUtils
@@ -30,14 +29,6 @@ from app.utils.system import SystemUtils
class PluginMonitorHandler(FileSystemEventHandler): class PluginMonitorHandler(FileSystemEventHandler):
# 计时器
__reload_timer = None
# 防抖时间间隔
__debounce_interval = 0.5
# 最近一次修改时间
__last_modified = 0
# 修改间隔
__timeout = 2
def on_modified(self, event): def on_modified(self, event):
""" """
@@ -50,10 +41,6 @@ class PluginMonitorHandler(FileSystemEventHandler):
if not event_path.name.endswith(".py") or "pycache" in event_path.parts: if not event_path.name.endswith(".py") or "pycache" in event_path.parts:
return return
current_time = time.time()
if current_time - self.__last_modified < self.__timeout:
return
self.__last_modified = current_time
# 读取插件根目录下的__init__.py文件,读取class XXXX(_PluginBase)的类名 # 读取插件根目录下的__init__.py文件,读取class XXXX(_PluginBase)的类名
try: try:
plugins_root = settings.ROOT_PATH / "app" / "plugins" plugins_root = settings.ROOT_PATH / "app" / "plugins"
@@ -75,15 +62,12 @@ class PluginMonitorHandler(FileSystemEventHandler):
if line.startswith("class") and "(_PluginBase)" in line: if line.startswith("class") and "(_PluginBase)" in line:
pid = line.split("class ")[1].split("(_PluginBase)")[0].strip() pid = line.split("class ")[1].split("(_PluginBase)")[0].strip()
if pid: if pid:
# 防抖处理,通过计时器延迟加载 self.__reload_plugin(pid)
if self.__reload_timer:
self.__reload_timer.cancel()
self.__reload_timer = threading.Timer(self.__debounce_interval, self.__reload_plugin, [pid])
self.__reload_timer.start()
except Exception as e: except Exception as e:
logger.error(f"插件文件修改后重载出错:{str(e)}") logger.error(f"插件文件修改后重载出错:{str(e)}")
@staticmethod @staticmethod
@rate_limit_window(max_calls=1, window_seconds=2, source="PluginMonitor", enable_logging=False)
def __reload_plugin(pid): def __reload_plugin(pid):
""" """
重新加载插件 重新加载插件