3 个版本 (破坏性更新)
0.3.0 | 2024年2月20日 |
---|---|
0.2.1 |
|
0.2.0 | 2024年1月28日 |
0.1.0 | 2023年10月3日 |
#1012 in 并发
每月下载 46 次
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
对象将阻止调度循环因为所有客户端都丢失而终止)。task
和 thread
模块中的示例说明了如何做到这一点。
依赖关系
~3–13MB
~125K SLoC