feat 多线程处理事件
This commit is contained in:
parent
e57b6adba1
commit
453ef94e4d
@ -13,6 +13,7 @@ from app.core.event import Event as ManagerEvent
|
|||||||
from app.core.event import eventmanager, EventManager
|
from app.core.event import eventmanager, EventManager
|
||||||
from app.core.plugin import PluginManager
|
from app.core.plugin import PluginManager
|
||||||
from app.db import SessionFactory
|
from app.db import SessionFactory
|
||||||
|
from app.helper.thread import ThreadHelper
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
from app.scheduler import Scheduler
|
from app.scheduler import Scheduler
|
||||||
from app.schemas import Notification
|
from app.schemas import Notification
|
||||||
@ -51,6 +52,8 @@ class Command(metaclass=Singleton):
|
|||||||
self.chain = CommandChian(self._db)
|
self.chain = CommandChian(self._db)
|
||||||
# 定时服务管理
|
# 定时服务管理
|
||||||
self.scheduler = Scheduler()
|
self.scheduler = Scheduler()
|
||||||
|
# 线程管理器
|
||||||
|
self.threader = ThreadHelper()
|
||||||
# 内置命令
|
# 内置命令
|
||||||
self._commands = {
|
self._commands = {
|
||||||
"/cookiecloud": {
|
"/cookiecloud": {
|
||||||
@ -192,7 +195,11 @@ class Command(metaclass=Singleton):
|
|||||||
[class_name, method_name] = names
|
[class_name, method_name] = names
|
||||||
if class_name in self.pluginmanager.get_plugin_ids():
|
if class_name in self.pluginmanager.get_plugin_ids():
|
||||||
# 插件事件
|
# 插件事件
|
||||||
self.pluginmanager.run_plugin_method(class_name, method_name, event)
|
self.threader.submit(
|
||||||
|
self.pluginmanager.run_plugin_method,
|
||||||
|
class_name, method_name, event
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# 检查全局变量中是否存在
|
# 检查全局变量中是否存在
|
||||||
if class_name not in globals():
|
if class_name not in globals():
|
||||||
@ -206,7 +213,10 @@ class Command(metaclass=Singleton):
|
|||||||
class_obj = globals()[class_name]()
|
class_obj = globals()[class_name]()
|
||||||
# 检查类是否存在并调用方法
|
# 检查类是否存在并调用方法
|
||||||
if hasattr(class_obj, method_name):
|
if hasattr(class_obj, method_name):
|
||||||
getattr(class_obj, method_name)(event)
|
self.threader.submit(
|
||||||
|
getattr(class_obj, method_name),
|
||||||
|
event
|
||||||
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"事件处理出错:{str(e)} - {traceback.format_exc()}")
|
logger.error(f"事件处理出错:{str(e)} - {traceback.format_exc()}")
|
||||||
|
|
||||||
|
31
app/helper/thread.py
Normal file
31
app/helper/thread.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
|
||||||
|
from app.utils.singleton import Singleton
|
||||||
|
|
||||||
|
|
||||||
|
class ThreadHelper(metaclass=Singleton):
|
||||||
|
"""
|
||||||
|
线程池管理
|
||||||
|
"""
|
||||||
|
def __init__(self, max_workers=50):
|
||||||
|
self.pool = ThreadPoolExecutor(max_workers=max_workers)
|
||||||
|
|
||||||
|
def submit(self, func, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
提交任务
|
||||||
|
:param func: 函数
|
||||||
|
:param args: 参数
|
||||||
|
:param kwargs: 参数
|
||||||
|
:return: future
|
||||||
|
"""
|
||||||
|
return self.pool.submit(func, *args, **kwargs)
|
||||||
|
|
||||||
|
def shutdown(self):
|
||||||
|
"""
|
||||||
|
关闭线程池
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self.pool.shutdown()
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.shutdown()
|
@ -16,14 +16,15 @@ if SystemUtils.is_frozen():
|
|||||||
sys.stdout = open(os.devnull, 'w')
|
sys.stdout = open(os.devnull, 'w')
|
||||||
sys.stderr = open(os.devnull, 'w')
|
sys.stderr = open(os.devnull, 'w')
|
||||||
|
|
||||||
from app.command import Command
|
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.core.module import ModuleManager
|
from app.core.module import ModuleManager
|
||||||
from app.core.plugin import PluginManager
|
from app.core.plugin import PluginManager
|
||||||
from app.db.init import init_db, update_db
|
from app.db.init import init_db, update_db
|
||||||
|
from app.helper.thread import ThreadHelper
|
||||||
from app.helper.display import DisplayHelper
|
from app.helper.display import DisplayHelper
|
||||||
from app.helper.sites import SitesHelper
|
from app.helper.sites import SitesHelper
|
||||||
from app.scheduler import Scheduler
|
from app.scheduler import Scheduler
|
||||||
|
from app.command import Command
|
||||||
|
|
||||||
# App
|
# App
|
||||||
App = FastAPI(title=settings.PROJECT_NAME,
|
App = FastAPI(title=settings.PROJECT_NAME,
|
||||||
@ -146,6 +147,8 @@ def shutdown_server():
|
|||||||
DisplayHelper().stop()
|
DisplayHelper().stop()
|
||||||
# 停止定时服务
|
# 停止定时服务
|
||||||
Scheduler().stop()
|
Scheduler().stop()
|
||||||
|
# 停止线程池
|
||||||
|
ThreadHelper().shutdown()
|
||||||
# 停止前端服务
|
# 停止前端服务
|
||||||
stop_frontend()
|
stop_frontend()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user