From 9aade6599c71a4ca065958788c52aca954505cd9 Mon Sep 17 00:00:00 2001 From: snowykami Date: Sat, 31 Aug 2024 19:51:34 +0800 Subject: [PATCH] =?UTF-8?q?:memo:=20=E6=96=87=E6=A1=A3=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E5=A4=A7=E8=BF=81=E7=A7=BB=20`vuepress`=20->=20`vitepress`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liteyuki/bot/__init__.py | 89 +++++++++++++++------------------- liteyuki/bot/lifespan.py | 76 +++++++++++++---------------- liteyuki/comm/channel.py | 60 +++++++++++------------ liteyuki/comm/event.py | 8 +-- liteyuki/comm/socks_channel.py | 8 +-- liteyuki/comm/storage.py | 2 +- liteyuki/dev/observer.py | 1 - 7 files changed, 103 insertions(+), 141 deletions(-) diff --git a/liteyuki/bot/__init__.py b/liteyuki/bot/__init__.py index d8c35773..f984d11f 100644 --- a/liteyuki/bot/__init__.py +++ b/liteyuki/bot/__init__.py @@ -8,7 +8,7 @@ import threading import time from typing import Any, Optional -from liteyuki.bot.lifespan import (LIFESPAN_FUNC, Lifespan) +from liteyuki.bot.lifespan import (LIFESPAN_FUNC, Lifespan, PROCESS_LIFESPAN_FUNC) from liteyuki.comm.channel import get_channel from liteyuki.core.manager import ProcessManager from liteyuki.log import init_log, logger @@ -24,13 +24,11 @@ __all__ = [ class LiteyukiBot: - def __init__(self, *args, **kwargs) -> None: + def __init__(self, **kwargs) -> None: """ 初始化轻雪实例 Args: - *args: **kwargs: 配置 - """ """常规操作""" print_logo() @@ -83,8 +81,6 @@ class LiteyukiBot: async def keep_alive(self): """ 保持轻雪运行 - Returns: - """ try: while not self.stop_event.is_set(): @@ -95,13 +91,12 @@ class LiteyukiBot: def _handle_exit(self, signum, frame): """ + @litedoc-hide + 信号处理 Args: - signum: - frame: - - Returns: - + signum: 信号 + frame: 帧 """ logger.info("Received signal, stopping all processes.") self.stop() @@ -110,8 +105,8 @@ class LiteyukiBot: def restart(self, delay: int = 0): """ 重启轻雪本体 - Returns: - + Args: + delay ([`int`](https%3A//docs.python.org/3/library/functions.html#int), optional): 延迟重启时间. Defaults to 0. """ if self.call_restart_count < 1: executable = sys.executable @@ -136,7 +131,7 @@ class LiteyukiBot: """ 停止轻雪 Args: - name: 进程名称, 默认为None, 所有进程 + name ([`Optional`](https%3A//docs.python.org/3/library/typing.html#typing.Optional)[[`str`](https%3A//docs.python.org/3/library/stdtypes.html#str)]): 进程名. Defaults to None. Returns: """ if name is not None: @@ -150,32 +145,32 @@ class LiteyukiBot: def init(self, *args, **kwargs): """ 初始化轻雪, 自动调用 - Returns: - + Args: + *args: 参数 + **kwargs: 关键字参数 """ self.init_logger() def init_logger(self): - # 修改nonebot的日志配置 + """ + 初始化日志 + """ init_log(config=self.config) def stop(self): """ 停止轻雪 - Returns: - """ self.stop_event.set() self.loop.stop() - def on_before_start(self, func: LIFESPAN_FUNC): + def on_before_start(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC: """ 注册启动前的函数 Args: - func: - + func ([`LIFESPAN_FUNC`](./lifespan#var-lifespan-func)): 生命周期函数 Returns: - + [`LIFESPAN_FUNC`](./lifespan#var-lifespan-func): 生命周期函数 """ return self.lifespan.on_before_start(func) @@ -183,10 +178,9 @@ class LiteyukiBot: """ 注册启动后的函数 Args: - func: - + func ([`LIFESPAN_FUNC`](./lifespan#var-lifespan-func)): 生命周期函数 Returns: - + [`LIFESPAN_FUNC`](./lifespan#var-lifespan-func): 生命周期函数 """ return self.lifespan.on_after_start(func) @@ -194,32 +188,29 @@ class LiteyukiBot: """ 注册停止后的函数:未实现 Args: - func: - + func ([`LIFESPAN_FUNC`](./lifespan#var-lifespan-func)): 生命周期函数 Returns: - + [`LIFESPAN_FUNC`](./lifespan#var-lifespan-func): 生命周期函数 """ return self.lifespan.on_after_shutdown(func) - def on_before_process_shutdown(self, func: LIFESPAN_FUNC): + def on_before_process_shutdown(self, func: PROCESS_LIFESPAN_FUNC): """ 注册进程停止前的函数,为子进程停止时调用 Args: - func: - + func ([`PROCESS_LIFESPAN_FUNC`](./lifespan#var-process-lifespan-func)): 生命周期函数 Returns: - + [`PROCESS_LIFESPAN_FUNC`](./lifespan#var-process-lifespan-func): 生命周期函数 """ return self.lifespan.on_before_process_shutdown(func) - def on_before_process_restart(self, func: LIFESPAN_FUNC): + def on_before_process_restart(self, func: PROCESS_LIFESPAN_FUNC) -> PROCESS_LIFESPAN_FUNC: """ 注册进程重启前的函数,为子进程重启时调用 Args: - func: - + func ([`PROCESS_LIFESPAN_FUNC`](./lifespan#var-process-lifespan-func)): 生命周期函数 Returns: - + [`PROCESS_LIFESPAN_FUNC`](./lifespan#var-process-lifespan-func): 生命周期函数 """ return self.lifespan.on_before_process_restart(func) @@ -228,10 +219,9 @@ class LiteyukiBot: """ 注册重启后的函数:未实现 Args: - func: - + func ([`LIFESPAN_FUNC`](./lifespan#var-lifespan-func)): 生命周期函数 Returns: - + [`LIFESPAN_FUNC`](./lifespan#var-lifespan-func): 生命周期函数 """ return self.lifespan.on_after_restart(func) @@ -242,9 +232,8 @@ _BOT_INSTANCE: LiteyukiBot def get_bot() -> LiteyukiBot: """ 获取轻雪实例 - Returns: - LiteyukiBot: 当前的轻雪实例 + [`LiteyukiBot`](#class-liteyukibot): 轻雪实例 """ if IS_MAIN_PROCESS: @@ -259,11 +248,10 @@ def get_config(key: str, default: Any = None) -> Any: """ 获取配置 Args: - key: 配置键 - default: 默认值 - + key ([`str`](https%3A//docs.python.org/3/library/stdtypes.html#str)): 配置键 + default ([`Any`](https%3A//docs.python.org/3/library/functions.html#any), optional): 默认值. Defaults to None. Returns: - Any: 配置值 + [`Any`](https%3A//docs.python.org/3/library/functions.html#any): 配置值 """ return get_bot().config.get(key, default) @@ -272,12 +260,12 @@ def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = Non """ 获取配置,兼容旧版本 Args: - key: 配置键 - compat_keys: 兼容键 - default: 默认值 + key ([`str`](https%3A//docs.python.org/3/library/stdtypes.html#str)): 配置键 + compat_keys ([`tuple`](https%3A//docs.python.org/3/library/stdtypes.html#tuple)[`str`](https%3A//docs.python.org/3/library/stdtypes.html#str)): 兼容键 + default ([`Any`](https%3A//docs.python.org/3/library/functions.html#any), optional): 默认值. Defaults to None. Returns: - Any: 配置值 + [`Any`](https%3A//docs.python.org/3/library/functions.html#any): 配置值 """ if key in get_bot().config: return get_bot().config[key] @@ -289,6 +277,7 @@ def get_config_with_compat(key: str, compat_keys: tuple[str], default: Any = Non def print_logo(): + """@litedoc-hide""" print("\033[34m" + r""" __ ______ ________ ________ __ __ __ __ __ __ ______ / | / |/ |/ |/ \ / |/ | / |/ | / |/ | diff --git a/liteyuki/bot/lifespan.py b/liteyuki/bot/lifespan.py index 78a6d925..06bcadad 100644 --- a/liteyuki/bot/lifespan.py +++ b/liteyuki/bot/lifespan.py @@ -9,18 +9,18 @@ Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved @Software: PyCharm """ import asyncio -from typing import Any, Awaitable, Callable, TypeAlias +from typing import Any, Awaitable, Callable, TypeAlias, Sequence from liteyuki.log import logger from liteyuki.utils import is_coroutine_callable, async_wrapper -SYNC_LIFESPAN_FUNC: TypeAlias = Callable[[], Any] -ASYNC_LIFESPAN_FUNC: TypeAlias = Callable[[], Awaitable[Any]] -LIFESPAN_FUNC: TypeAlias = SYNC_LIFESPAN_FUNC | ASYNC_LIFESPAN_FUNC +SYNC_LIFESPAN_FUNC: TypeAlias = Callable[[], Any] # 同步生命周期函数 +ASYNC_LIFESPAN_FUNC: TypeAlias = Callable[[], Awaitable[Any]] # 异步生命周期函数 +LIFESPAN_FUNC: TypeAlias = SYNC_LIFESPAN_FUNC | ASYNC_LIFESPAN_FUNC # 生命周期函数 -SYNC_PROCESS_LIFESPAN_FUNC: TypeAlias = Callable[[str], Any] -ASYNC_PROCESS_LIFESPAN_FUNC: TypeAlias = Callable[[str], Awaitable[Any]] -PROCESS_LIFESPAN_FUNC: TypeAlias = SYNC_PROCESS_LIFESPAN_FUNC | ASYNC_PROCESS_LIFESPAN_FUNC +SYNC_PROCESS_LIFESPAN_FUNC: TypeAlias = Callable[[str], Any] # 同步进程生命周期函数 +ASYNC_PROCESS_LIFESPAN_FUNC: TypeAlias = Callable[[str], Awaitable[Any]] # 异步进程生命周期函数 +PROCESS_LIFESPAN_FUNC: TypeAlias = SYNC_PROCESS_LIFESPAN_FUNC | ASYNC_PROCESS_LIFESPAN_FUNC # 进程函数 class Lifespan: @@ -33,21 +33,20 @@ class Lifespan: self._before_start_funcs: list[LIFESPAN_FUNC] = [] self._after_start_funcs: list[LIFESPAN_FUNC] = [] - self._before_process_shutdown_funcs: list[LIFESPAN_FUNC] = [] + self._before_process_shutdown_funcs: list[PROCESS_LIFESPAN_FUNC] = [] self._after_shutdown_funcs: list[LIFESPAN_FUNC] = [] - self._before_process_restart_funcs: list[LIFESPAN_FUNC] = [] + self._before_process_restart_funcs: list[PROCESS_LIFESPAN_FUNC] = [] self._after_restart_funcs: list[LIFESPAN_FUNC] = [] @staticmethod - async def run_funcs(funcs: list[ASYNC_LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None: + async def run_funcs(funcs: Sequence[LIFESPAN_FUNC | PROCESS_LIFESPAN_FUNC], *args, **kwargs) -> None: """ 并发运行异步函数 Args: - funcs: + funcs ([`Sequence`](https%3A//docs.python.org/3/library/typing.html#typing.Sequence)[[`ASYNC_LIFESPAN_FUNC`](#var-lifespan-func) | [`PROCESS_LIFESPAN_FUNC`](#var-process-lifespan-func)]): 函数列表 Returns: """ - loop = asyncio.get_running_loop() tasks = [func(*args, **kwargs) if is_coroutine_callable(func) else async_wrapper(func)(*args, **kwargs) for func in funcs] await asyncio.gather(*tasks) @@ -55,9 +54,9 @@ class Lifespan: """ 注册启动时的函数 Args: - func: + func ([`LIFESPAN_FUNC`](#var-lifespan-func)): 生命周期函数 Returns: - LIFESPAN_FUNC: + [`LIFESPAN_FUNC`](#var-lifespan-func): 生命周期函数 """ self._before_start_funcs.append(func) return func @@ -66,20 +65,20 @@ class Lifespan: """ 注册启动时的函数 Args: - func: + func ([`LIFESPAN_FUNC`](#var-lifespan-func)): 生命周期函数 Returns: - LIFESPAN_FUNC: + [`LIFESPAN_FUNC`](#var-lifespan-func): 生命周期函数 """ self._after_start_funcs.append(func) return func - def on_before_process_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC: + def on_before_process_shutdown(self, func: PROCESS_LIFESPAN_FUNC) -> PROCESS_LIFESPAN_FUNC: """ - 注册停止前的函数 + 注册进程停止前的函数 Args: - func: + func ([`PROCESS_LIFESPAN_FUNC`](#var-process-lifespan-func)): 进程生命周期函数 Returns: - LIFESPAN_FUNC: + [`PROCESS_LIFESPAN_FUNC`](#var-process-lifespan-func): 进程生命周期函数 """ self._before_process_shutdown_funcs.append(func) return func @@ -88,22 +87,20 @@ class Lifespan: """ 注册停止后的函数 Args: - func: - + func ([`LIFESPAN_FUNC`](#var-lifespan-func)): 生命周期函数 Returns: - LIFESPAN_FUNC: - + [`LIFESPAN_FUNC`](#var-lifespan-func): 生命周期函数 """ self._after_shutdown_funcs.append(func) return func - def on_before_process_restart(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC: + def on_before_process_restart(self, func: PROCESS_LIFESPAN_FUNC) -> PROCESS_LIFESPAN_FUNC: """ - 注册重启时的函数 + 注册进程重启前的函数 Args: - func: + func ([`PROCESS_LIFESPAN_FUNC`](#var-process-lifespan-func)): 进程生命周期函数 Returns: - LIFESPAN_FUNC: + [`PROCESS_LIFESPAN_FUNC`](#var-process-lifespan-func): 进程生命周期函数 """ self._before_process_restart_funcs.append(func) return func @@ -112,58 +109,51 @@ class Lifespan: """ 注册重启后的函数 Args: - func: + func ([`LIFESPAN_FUNC`](#var-lifespan-func)): 生命周期函数 Returns: - LIFESPAN_FUNC: + [`LIFESPAN_FUNC`](#var-lifespan-func): 生命周期函数 """ self._after_restart_funcs.append(func) return func async def before_start(self) -> None: """ - 启动前 - Returns: + 启动前钩子 """ logger.debug("Running before_start functions") await self.run_funcs(self._before_start_funcs) async def after_start(self) -> None: """ - 启动后 - Returns: + 启动后钩子 """ logger.debug("Running after_start functions") await self.run_funcs(self._after_start_funcs) async def before_process_shutdown(self) -> None: """ - 停止前 - Returns: + 停止前钩子 """ logger.debug("Running before_shutdown functions") await self.run_funcs(self._before_process_shutdown_funcs) async def after_shutdown(self) -> None: """ - 停止后 - Returns: + 停止后钩子 未实现 """ logger.debug("Running after_shutdown functions") await self.run_funcs(self._after_shutdown_funcs) async def before_process_restart(self) -> None: """ - 重启前 - Returns: + 重启前钩子 """ logger.debug("Running before_restart functions") await self.run_funcs(self._before_process_restart_funcs) async def after_restart(self) -> None: """ - 重启后 - Returns: - + 重启后钩子 未实现 """ logger.debug("Running after_restart functions") await self.run_funcs(self._after_restart_funcs) diff --git a/liteyuki/comm/channel.py b/liteyuki/comm/channel.py index ac695b1a..c077717a 100644 --- a/liteyuki/comm/channel.py +++ b/liteyuki/comm/channel.py @@ -1,13 +1,5 @@ # -*- coding: utf-8 -*- """ -Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved - -@Time : 2024/7/26 下午11:21 -@Author : snowykami -@Email : snowykami@outlook.com -@File : channel_.py -@Software: PyCharm - 本模块定义了一个通用的通道类,用于进程间通信 """ import asyncio @@ -19,13 +11,13 @@ from liteyuki.utils import IS_MAIN_PROCESS, is_coroutine_callable T = TypeVar("T") -SYNC_ON_RECEIVE_FUNC: TypeAlias = Callable[[T], Any] -ASYNC_ON_RECEIVE_FUNC: TypeAlias = Callable[[T], Coroutine[Any, Any, Any]] -ON_RECEIVE_FUNC: TypeAlias = SYNC_ON_RECEIVE_FUNC | ASYNC_ON_RECEIVE_FUNC +SYNC_ON_RECEIVE_FUNC: TypeAlias = Callable[[T], Any] # 同步接收函数 +ASYNC_ON_RECEIVE_FUNC: TypeAlias = Callable[[T], Coroutine[Any, Any, Any]] # 异步接收函数 +ON_RECEIVE_FUNC: TypeAlias = SYNC_ON_RECEIVE_FUNC | ASYNC_ON_RECEIVE_FUNC # 接收函数 -SYNC_FILTER_FUNC: TypeAlias = Callable[[T], bool] -ASYNC_FILTER_FUNC: TypeAlias = Callable[[T], Coroutine[Any, Any, bool]] -FILTER_FUNC: TypeAlias = SYNC_FILTER_FUNC | ASYNC_FILTER_FUNC +SYNC_FILTER_FUNC: TypeAlias = Callable[[T], bool] # 同步过滤函数 +ASYNC_FILTER_FUNC: TypeAlias = Callable[[T], Coroutine[Any, Any, bool]] # 异步过滤函数 +FILTER_FUNC: TypeAlias = SYNC_FILTER_FUNC | ASYNC_FILTER_FUNC # 过滤函数 _func_id: int = 0 _channel: dict[str, "Channel"] = {} @@ -77,7 +69,6 @@ class Channel(Generic[T]): def _get_generic_type(self) -> Optional[type]: """ 获取通道传递泛型类型 - Returns: Optional[type]: 泛型类型 """ @@ -91,7 +82,6 @@ class Channel(Generic[T]): Args: data: 数据 structure: 结构 - Returns: bool: 是否通过验证 """ @@ -118,7 +108,7 @@ class Channel(Generic[T]): """ 发送数据,发送函数为同步函数,没有异步的必要 Args: - data: 数据 + data (T): 数据 """ if self.type_check: _type = self._get_generic_type() @@ -132,7 +122,8 @@ class Channel(Generic[T]): def receive(self) -> T: """ 同步接收数据,会阻塞线程 - Args: + Returns: + T: 数据 """ if self._closed: raise RuntimeError("Cannot receive from a closed channel_") @@ -144,6 +135,8 @@ class Channel(Generic[T]): async def async_receive(self) -> T: """ 异步接收数据,会挂起等待 + Returns: + T: 数据 """ print("等待接收数据") loop = asyncio.get_running_loop() @@ -155,9 +148,9 @@ class Channel(Generic[T]): """ 接收数据并执行函数 Args: - filter_func: 过滤函数,为None则不过滤 + filter_func ([`Optional`](https%3A//docs.python.org/3/library/typing.html#typing.Optional)[[`FILTER_FUNC`](#var-FILTER_FUNC)], optional): 过滤函数. Defaults to None. Returns: - 装饰器,装饰一个函数在接收到数据后执行 + Callable[[Callable[[T], Any]], Callable[[T], Any]]: 装饰器 """ if not IS_MAIN_PROCESS: raise RuntimeError("on_receive can only be used in main process") @@ -202,6 +195,7 @@ class Channel(Generic[T]): async def start_receive_loop(self): """ + @litedoc-hide 开始接收数据 会自动判断主进程和子进程,需要在对应进程都调度一次 """ @@ -217,16 +211,16 @@ class Channel(Generic[T]): """子进程可用的主动和被动通道""" -active_channel: Channel = Channel(name="active_channel") -passive_channel: Channel = Channel(name="passive_channel") -publish_channel: Channel[tuple[str, dict[str, Any]]] = Channel(name="publish_channel") +active_channel: Channel = Channel(name="active_channel") # 主动通道 +passive_channel: Channel = Channel(name="passive_channel") # 被动通道 +publish_channel: Channel[tuple[str, dict[str, Any]]] = Channel(name="publish_channel") # 发布通道 """通道传递通道,主进程创建单例,子进程初始化时实例化""" -channel_deliver_active_channel: Channel[Channel[Any]] -channel_deliver_passive_channel: Channel[tuple[str, dict[str, Any]]] +channel_deliver_active_channel: Channel[Channel[Any]] # 主动通道传递通道 +channel_deliver_passive_channel: Channel[tuple[str, dict[str, Any]]] # 被动通道传递通道 if IS_MAIN_PROCESS: - channel_deliver_active_channel = Channel(name="channel_deliver_active_channel") - channel_deliver_passive_channel = Channel(name="channel_deliver_passive_channel") + channel_deliver_active_channel = Channel(name="channel_deliver_active_channel") # 主动通道传递通道 + channel_deliver_passive_channel = Channel(name="channel_deliver_passive_channel") # 被动通道传递通道 @channel_deliver_passive_channel.on_receive(filter_func=lambda data: data[0] == "set_channel") @@ -251,8 +245,8 @@ def set_channel(name: str, channel: "Channel"): """ 设置通道实例 Args: - name: 通道名称 - channel: 通道实例 + name ([`str`](https%3A//docs.python.org/3/library/stdtypes.html#str)): 通道名称 + channel ([`Channel`](#class-channel-generic-t)): 通道实例 """ if not isinstance(channel, Channel): raise TypeError(f"channel_ must be an instance of Channel, {type(channel)} found") @@ -277,7 +271,7 @@ def set_channels(channels: dict[str, "Channel"]): """ 设置通道实例 Args: - channels: 通道名称 + channels ([`dict`](https%3A//docs.python.org/3/library/stdtypes.html#dict)[[`str`](https%3A//docs.python.org/3/library/stdtypes.html#str), [`Channel`](#class-channel-generic-t)]): 通道实例 """ for name, channel in channels.items(): set_channel(name, channel) @@ -287,8 +281,9 @@ def get_channel(name: str) -> "Channel": """ 获取通道实例 Args: - name: 通道名称 + name ([`str`](https%3A//docs.python.org/3/library/stdtypes.html#str)): 通道名称 Returns: + [`Channel`](#class-channel-generic-t): 通道实例 """ if IS_MAIN_PROCESS: return _channel[name] @@ -309,8 +304,9 @@ def get_channel(name: str) -> "Channel": def get_channels() -> dict[str, "Channel"]: """ - 获取通道实例 + 获取通道实例们 Returns: + [`dict`](https%3A//docs.python.org/3/library/stdtypes.html#dict)[[`str`](https%3A//docs.python.org/3/library/stdtypes.html#str), [`Channel`](#class-channel-generic-t)]: 通道实例 """ if IS_MAIN_PROCESS: return _channel diff --git a/liteyuki/comm/event.py b/liteyuki/comm/event.py index c3bddbf3..3808b52b 100644 --- a/liteyuki/comm/event.py +++ b/liteyuki/comm/event.py @@ -1,12 +1,6 @@ # -*- coding: utf-8 -*- """ -Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved - -@Time : 2024/7/26 下午10:47 -@Author : snowykami -@Email : snowykami@outlook.com -@File : event.py -@Software: PyCharm +本模块用于轻雪主进程和子进程之间的通信的事件类 """ from typing import Any diff --git a/liteyuki/comm/socks_channel.py b/liteyuki/comm/socks_channel.py index b4043085..46b8a097 100644 --- a/liteyuki/comm/socks_channel.py +++ b/liteyuki/comm/socks_channel.py @@ -1,12 +1,6 @@ # -*- coding: utf-8 -*- """ -Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved - -@Time : 2024/8/25 下午3:54 -@Author : snowykami -@Email : snowykami@outlook.com -@File : channelv2.py -@Software: PyCharm +基于socket的通道 """ diff --git a/liteyuki/comm/storage.py b/liteyuki/comm/storage.py index 1971fcb9..d64db350 100644 --- a/liteyuki/comm/storage.py +++ b/liteyuki/comm/storage.py @@ -234,7 +234,7 @@ class GlobalKeyValueStore: return cls._instance -shared_memory: KeyValueStore = GlobalKeyValueStore.get_instance() +shared_memory: KeyValueStore = GlobalKeyValueStore.get_instance() # 共享内存对象 # 全局单例访问点 if IS_MAIN_PROCESS: diff --git a/liteyuki/dev/observer.py b/liteyuki/dev/observer.py index 6871481a..1d875ef7 100644 --- a/liteyuki/dev/observer.py +++ b/liteyuki/dev/observer.py @@ -21,7 +21,6 @@ def debounce(wait): """ 防抖函数 """ - def decorator(func): def wrapper(*args, **kwargs): nonlocal last_call_time