#actor #tokio #messages #run-time #exit #gen-server #bctor

tokio_gen_server

基于Tokio运行时的Elixir/Erlang-GenServer类似actor

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 异步

Download history 84/week @ 2024-04-13 299/week @ 2024-05-18 10/week @ 2024-05-25 150/week @ 2024-06-15 464/week @ 2024-06-22 28/week @ 2024-06-29 188/week @ 2024-07-06 16/week @ 2024-07-13 1/week @ 2024-07-20 12/week @ 2024-07-27

每月下载量 221
3 crates 中使用

MIT 许可证

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的退出。

替代方案

Hydra:

  • 👍 实现"正确"的"进程";接口更接近Erlang。
  • 👍 "child"和"pid"上的类型擦除。
  • 👍 监督器。
  • 👍 多节点。
  • ❓ 捕获展开(也因为开销而不好?)。
  • ❓ 使用flume通道:可能更快,但更多依赖。
  • 👎 需要创建"应用程序"并且"污染"代码库。
  • 👎 调用、广播和回复消息类型没有区分。
  • 👎 使用魔法全局变量来管理"进程"。
  • 👎 没有阻塞。
  • 👎 需要消息可序列化。
  • 👎 大多数特质不是对象安全的。

依赖项

~5–7.5MB
~135K SLoC