Iroh 中的异步 Rust 挑战

主要观点

  • iroh 是用于 p2p 网络和数据传输的 Rust 包集合,可通过多种方式访问和使用。
  • 需支持所有主要平台,包括移动设备。
  • 对于 iroh-net 等项目,async 是必要的,选择 Tokio 作为最流行和维护良好的 async 运行时。
  • 处理阻塞代码时,可通过多种方式,如使用 IO 工作线程、单线程运行时等。
  • Tokio 使用较复杂,需小心避免 panic,如在不同上下文中调用 Tokio 方法。
  • Drop 操作在与 Tokio 交互时存在问题,需使用特定队列处理。
  • Tokio 易导致 detached tasks 和 swallowed panics,应避免使用 tokio::spawn 而不处理结果。
  • tokio_util 的本地池实现存在 major issue,需使用自定义实现。
  • futures crate 的一些复杂组合器存在 bug,已决定停止使用并替换。
  • tracing 库在某些情况下会出现 panic 问题。
  • 选择 mpmc 通道时,flume 存在 cancel safety 问题,async-channel 是目前的替代选择。

关键信息

  • iroh 可通过iroh 二进制FFI bindingsiroh crate或导入模块使用。
  • 支持多种平台,如 Raspberry Pis、Android、iOS 移动电话、云服务器等。
  • async 在 iroh-net 中用于 quinn 实现的 QUIC,iroh-blobs也需处理频繁并发交互。
  • Tokio 是默认运行时,其他运行时如 async-std 多年未更新,smol 不活跃,glommio 限于 Linux。
  • 处理阻塞代码可用 IO 工作线程、单线程运行时,文件 IO 时用单独线程池处理。
  • Tokio 使用需小心,不同函数在不同状态下调用可能 panic,本地任务更复杂。
  • Drop 操作在与 Tokio 交互时需特殊处理,可用特定队列。
  • Tokio 易导致 detached tasks 和 swallowed panics,应妥善处理。
  • tokio_util 本地池实现有问题,需自定义实现。
  • futures crate 组合器有 bug,已停止使用并替换。
  • tracing 库在某些情况下会出现 panic 问题。
  • 选择 mpmc 通道时,flume 存在问题,async-channel 是替代选择。

重要细节

  • Redb 是同步嵌入式数据库,使用时需注意。
  • 在 Tokio 中,不同函数的调用安全性与线程本地状态等有关。
  • 处理 Drop 时可用多种队列,如 flume、async-channel 等。
  • Tokio 的本地任务处理需小心,避免出现问题。
  • futures-litefutures-bufferedfutures-util用于替换futures crate。
  • iroh 是可定制的网络库,已在生产中使用,可通过文档、代码或 discord 频道了解。
阅读 15
0 条评论