From 47ef3f2a49057df3ccf50be1d6e23a260c765599 Mon Sep 17 00:00:00 2001 From: snowy Date: Mon, 12 Aug 2024 05:50:12 +0800 Subject: [PATCH] =?UTF-8?q?:memo:=20=E6=B7=BB=E5=8A=A0=E8=BD=BB=E9=9B=AA?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=BC=96=E5=86=99=E7=AE=80=E6=98=93=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=92=8C=E8=BD=BB=E9=9B=AA=E8=BF=9B=E7=A8=8B=E9=80=9A?= =?UTF-8?q?=E4=BF=A1=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev/dev_comm.md | 76 ++++++++++++++++++++++++++++++++++++++++ docs/dev/dev_lyplugin.md | 3 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 docs/dev/dev_comm.md diff --git a/docs/dev/dev_comm.md b/docs/dev/dev_comm.md new file mode 100644 index 00000000..cd554ea2 --- /dev/null +++ b/docs/dev/dev_comm.md @@ -0,0 +1,76 @@ +--- +title: 进程通信 +icon: exchange-alt +order: 4 +category: 开发 +--- + +## 简介 + +轻雪运行在主进程 MainProcess 里,其他插件框架进程是伴随的子进程,因此无法通过内存共享和直接对象传递的方式进行通信,轻雪提供了一个通道`Channel`用于跨进程通信,你可以通过`Channel`发送消息给其他进程,也可以监听其他进程的消息。 + +例如子进程接收到用户信息需要重启机器人,这时可以通过通道对主进程发送消息,主进程接收到消息后重启对应子进程。 + +## 快速开始 + +通道是全双工的,有两种接收模式,但一个通道只能使用一种,即被动模式和主动模式,被动模式由`chan.on_receive()`装饰回调函数实现,主动模式需调用`chan.receive()`实现 + +轻雪核心在创建子进程的同时会初始化两个通道,一个被动通道和一个主动通道,且通道标识为`{process_name}-active`和`{process_name}-passive`,你可以通过`get_channel`函数获取通道对象,然后通过`send`方法发送消息 + +- 在轻雪插件中 + +```python + +import asyncio + +from liteyuki.comm import get_channel, Channel +from liteyuki import get_bot + +channel_passive = get_channel("nonebot-passive") +channel_active = get_channel("nonebot-active") +liteyuki_bot = get_bot() + + +@liteyuki_bot.on_after_start +async def do_something_after_start(): + while True: + channel_passive.send("I am liteyuki main process passive") + await asyncio.sleep(0.1) + channel_active.send("I am liteyuki main process active") + await asyncio.sleep(3) +``` + +- 在子进程中(可以是NoneBot插件中) + +```python +from nonebot import get_driver +from liteyuki.comm import get_channel +from liteyuki.log import logger + +driver = get_driver() + +channel_passive = get_channel("nonebot-passive") +channel_active = get_channel("nonebot-active") + + +@channel_passive.on_receive() +async def on_passive_receive(data): + logger.info(f"Passive receive: {data}") + + +@driver.on_startup +async def on_startup(): + while True: + data = channel_active.receive() + logger.info(f"Active receive: {data}") +``` + +- 启动后控制台输出 + +```shell +..-..-.. ..:..:.. [ℹ️信息] Passive receive: I am liteyuki main process passive +..-..-.. ..:..:.. [ℹ️信息] Active receive: I am liteyuki main process active +..-..-.. ..:..:.. [ℹ️信息] Passive receive: I am liteyuki main process passive +..-..-.. ..:..:.. [ℹ️信息] Active receive: I am liteyuki main process active +... +``` \ No newline at end of file diff --git a/docs/dev/dev_lyplugin.md b/docs/dev/dev_lyplugin.md index 6bd5e948..8ca6a83d 100644 --- a/docs/dev/dev_lyplugin.md +++ b/docs/dev/dev_lyplugin.md @@ -5,7 +5,8 @@ order: 3 category: 开发 --- -# 简介 + +## 简介 轻雪插件是轻雪内置的一部分功能,运行在主进程中,可以很高程度地扩展轻雪的功能