9个版本 (4个重大更新)
0.5.0 | 2024年7月10日 |
---|---|
0.4.4 | 2024年6月25日 |
0.4.0 | 2024年5月19日 |
0.3.0 | 2024年5月19日 |
0.1.0 | 2024年2月10日 |
#291 in 异步
每月下载量 221
在 3 crates 中使用
50KB
917 行
Tokio GenServer
在Tokio上实现的简单的Elixir/Erlang-GenServer类似actor
请参阅文档以获取使用和示例信息。
- 简单:定义3种消息类型和至少一个回调,你就有了一个actor。没有宏魔法。没有全局的"system"或"污染"。
- 强大:初始化和退出回调。完成时,返回actor本身、整个运行环境和运行结果。
- 轻量级:代码少。除了Tokio引入的之外,没有其他装箱。
- 用于同步代码的阻塞actor(
Bctor
)。
注意:什么是GenServer?通用服务器是一个持久进程,用于处理发送给它的消息。就是这样。消息可以是广播(fire-and-forget)或调用(请求-响应)。
与Erlang的主要区别
- 不要恐慌(崩溃)。改为返回
anyhow::Error
。 - Tokio的调度是 合作的,而不是抢占式的。您的长时间运行的异步代码应该在中间调用
yield_now
,以便它们可以被中断。 - 通用的监督实现并不非常有用。相反,让您的actor创建子actor,并让子actor通过使用
before_exit
向父actor发送消息来处理子actor的退出。
替代方案
- 👍 实现"正确"的"进程";接口更接近Erlang。
- 👍 "child"和"pid"上的类型擦除。
- 👍 监督器。
- 👍 多节点。
- ❓ 捕获展开(也因为开销而不好?)。
- ❓ 使用flume通道:可能更快,但更多依赖。
- 👎 需要创建"应用程序"并且"污染"代码库。
- 👎 调用、广播和回复消息类型没有区分。
- 👎 使用魔法全局变量来管理"进程"。
- 👎 没有阻塞。
- 👎 需要消息可序列化。
- 👎 大多数特质不是对象安全的。
依赖项
~5–7.5MB
~135K SLoC