#thread #sync #channel #message-passing

ump-ng-server

ump-ng 的服务器消息分发循环

5 个不稳定版本

0.3.0 2024 年 2 月 20 日
0.2.1 2024 年 2 月 20 日
0.2.0 2024 年 1 月 28 日
0.1.2 2024 年 1 月 21 日
0.1.0 2023 年 10 月 3 日

#997并发

Download history 9/week @ 2024-03-12 26/week @ 2024-04-02 35/week @ 2024-04-16

83 每月下载量

0BSD 许可证

18KB
229

ump-ng 的服务器消息分发循环

ump-ng-server crate 是为 ump-ng 提供的服务器消息分发抽象。


lib.rs:

ump-ng-server 是在 ump-ng 之上的一个抽象,用于隐藏实现进程内消息传递服务器所需的样板代码。

分发循环

ump-ng-server 的核心功能是一个分发循环,其作用是从消息队列中提取消息并将其传递给由应用程序提供的消息处理器。

运行分发循环有两种不同的方式:在非异步线程上或作为一个异步任务。前者使用 [thread::spawn()] 启动,后者 [task::spawn()](仅在使用 tokio 功能时可用)。

spawn() 函数返回一个包含 Client(可用于向服务器发送消息)和 JoinHandle 的元组,后者可用于等待分发循环线程/任务的终止(并检索其返回值)。

返回的 JoinHandle 会在连接后返回一个 Option<RV>。如果这是 None,则服务器是因为所有 Client 端点都被丢弃而终止的。如果这是 Some(RV),则服务器是因为回调请求终止而返回 ControlFlow::Break(RV) 而终止的。

终止分发循环有两种方式

  • 消息处理处理程序返回 ControlFlow::Break(RV)(而不是 ControlFlow::Continue(()))。这会导致线程/任务返回 Some(RV)
  • 消息队列为空,并且所有相关 Client 都已释放。这会导致线程返回 None

应用程序消息处理程序

消息处理程序使用 thread::Handler 特性(用于线程化的调度循环)和 task::Handler(用于异步调度循环)实现。

在某些情况下,处理程序需要存储传递消息的通道中客户端端的克隆(以便消息处理程序可以发出新的请求)。为了实现这一点,应用程序必须将 Handler-构造闭包传递给 spawn()。闭包将在消息传递通道创建后调用,以便可以传递客户端端的引用。

如果调度循环应在所有应用程序的客户端端点都已丢弃后终止,则处理程序可以存储一个 WeakClient(而不是存储克隆的 Client 对象,这将阻止调度循环由于所有客户端丢失而终止)。 taskthread 模块中的示例说明了如何这样做。

依赖关系

~3–13MB
~136K SLoC