#thread #message-passing #sync #channel

ump-server

ump的服务器消息分发循环

3 个版本 (破坏性更新)

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

#1012 in 并发

每月下载 46

0BSD 许可证

18KB
216

ump的服务器消息分发循环

ump-server crate 是为 ump 实现的服务器消息分发抽象。


lib.rs:

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

分发循环

ump-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
~125K SLoC