🐛 fix: Channel的接收者过滤器的问题,优化重启部分

This commit is contained in:
snowy 2024-07-31 02:35:05 +08:00
parent ca34f9c2a1
commit 6ba983fae3
3 changed files with 15 additions and 17 deletions

View File

@ -3,7 +3,6 @@ import asyncio
from typing import Any, Optional from typing import Any, Optional
from multiprocessing import freeze_support from multiprocessing import freeze_support
from liteyuki.bot.lifespan import (LIFESPAN_FUNC, Lifespan) from liteyuki.bot.lifespan import (LIFESPAN_FUNC, Lifespan)
from liteyuki.comm.channel import Channel from liteyuki.comm.channel import Channel
from liteyuki.core import IS_MAIN_PROCESS from liteyuki.core import IS_MAIN_PROCESS
@ -32,7 +31,6 @@ class LiteyukiBot:
self.chan = Channel() # 进程通信通道 self.chan = Channel() # 进程通信通道
self.pm: Optional[ProcessManager] = None # 启动时实例化 self.pm: Optional[ProcessManager] = None # 启动时实例化
print("\033[34m" + r""" print("\033[34m" + r"""
__ ______ ________ ________ __ __ __ __ __ __ ______ __ ______ ________ ________ __ __ __ __ __ __ ______
/ | / |/ |/ |/ \ / |/ | / |/ | / |/ | / | / |/ |/ |/ \ / |/ | / |/ | / |/ |
@ -49,12 +47,12 @@ $$$$$$$$/ $$$$$$/ $$/ $$$$$$$$/ $$/ $$$$$$/ $$/ $$/ $$$$$$/
# load_plugins("liteyuki/plugins") # 加载轻雪插件 # load_plugins("liteyuki/plugins") # 加载轻雪插件
self.pm = ProcessManager(bot=self, chan=self.chan) self.pm = ProcessManager(bot=self, chan=self.chan)
self.pm.add_target("melobot", mb_run, **self.config)
self.pm.start("melobot")
self.pm.add_target("nonebot", nb_run, **self.config) self.pm.add_target("nonebot", nb_run, **self.config)
self.pm.start("nonebot") self.pm.start("nonebot")
self.pm.add_target("melobot", mb_run, **self.config)
self.pm.start("melobot")
run_coroutine(self.lifespan.after_start()) # 启动前 run_coroutine(self.lifespan.after_start()) # 启动前
def restart(self, name: Optional[str] = None): def restart(self, name: Optional[str] = None):

View File

@ -31,7 +31,7 @@ class Channel:
""" """
def __init__(self): def __init__(self):
self.parent_conn, self.child_conn = Pipe() self.receive_conn, self.send_conn = Pipe()
self._closed = False self._closed = False
self._on_receive_funcs: List[ON_RECEIVE_FUNC] = [] self._on_receive_funcs: List[ON_RECEIVE_FUNC] = []
self._on_receive_funcs_with_receiver: dict[str, List[ON_RECEIVE_FUNC]] = {} self._on_receive_funcs_with_receiver: dict[str, List[ON_RECEIVE_FUNC]] = {}
@ -45,7 +45,7 @@ class Channel:
""" """
if self._closed: if self._closed:
raise RuntimeError("Cannot send to a closed channel") raise RuntimeError("Cannot send to a closed channel")
self.child_conn.send((data, receiver)) self.send_conn.send((data, receiver))
def receive(self, receiver: str = None) -> Any: def receive(self, receiver: str = None) -> Any:
""" """
@ -57,11 +57,11 @@ class Channel:
raise RuntimeError("Cannot receive from a closed channel") raise RuntimeError("Cannot receive from a closed channel")
while True: while True:
# 判断receiver是否为None或者receiver是否等于接收者是则接收数据否则不动数据 # 判断receiver是否为None或者receiver是否等于接收者是则接收数据否则不动数据
if self.parent_conn.poll(): data, receiver_ = self.receive_conn.recv()
data, receiver = self.parent_conn.recv() if receiver is None or receiver == receiver_:
self.parent_conn.send((data, receiver)) self._run_on_receive_funcs(data, receiver_)
self._run_on_receive_funcs(data, receiver)
return data return data
self.send_conn.send((data, receiver_))
def peek(self) -> Optional[Any]: def peek(self) -> Optional[Any]:
""" """
@ -70,9 +70,9 @@ class Channel:
""" """
if self._closed: if self._closed:
raise RuntimeError("Cannot peek from a closed channel") raise RuntimeError("Cannot peek from a closed channel")
if self.parent_conn.poll(): if self.receive_conn.poll():
data, receiver = self.parent_conn.recv() data, receiver = self.receive_conn.recv()
self.parent_conn.send((data, receiver)) self.receive_conn.send((data, receiver))
return data return data
return None return None
@ -81,8 +81,8 @@ class Channel:
关闭通道 关闭通道
""" """
self._closed = True self._closed = True
self.parent_conn.close() self.receive_conn.close()
self.child_conn.close() self.send_conn.close()
def on_receive(self, filter_func: Optional[FILTER_FUNC] = None, receiver: Optional[str] = None) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]: def on_receive(self, filter_func: Optional[FILTER_FUNC] = None, receiver: Optional[str] = None) -> Callable[[ON_RECEIVE_FUNC], ON_RECEIVE_FUNC]:
""" """

View File

@ -53,7 +53,7 @@ class ProcessManager:
while not should_exit: while not should_exit:
# 0退出 1重启 # 0退出 1重启
data = self.chan.receive(name) data = self.chan.receive(name)
print("Received data: ", data) print("Received data: ", data, name)
if data == 1: if data == 1:
logger.info("Restarting LiteyukiBot...") logger.info("Restarting LiteyukiBot...")
process.terminate() process.terminate()