10个版本
0.2.12 | 2024年2月24日 |
---|---|
0.2.11 | 2024年2月18日 |
0.2.4 | 2024年1月19日 |
#13 in #ergonomics
383 每月下载量
用于 ouch_bindings_python
295KB
4.5K SLoC
动机
- 项目的动机是简化网络通信领域的应用程序代码开发。重点关注性能和易用性。
它是如何简化的?
-
传统上,网络API提供的方法暴露了对非常低级的数据(字节数组)的访问,而应用层更愿意与携带应用程序状态信息的结构体(struct)一起工作。
-
Rust的std::net模块并非例外,它将解释字节数组的责任留给开发者,开发者需要执行一系列步骤来从数组中提取单个字节数据帧,将其转换为所需的数据结构,同时跟踪剩余的字节并管理很多其他细节。这里的实现细节对应用程序性能和可靠性有直接影响。
-
即使解决了这些细节,开发者仍需解决许多其他任务,例如
- 如何处理部分读取?
- 能否在不同线程之间拆分读写操作?
- 如果我将读取拆分到单独的线程,能否使用单个线程来管理所有读取?
- ...等等
-
这个库解决了上述挑战,同时提供了高性能的网络代码,而不限制应用程序如何使用API。
请告诉我更多
-
从非常高的角度来看,主要概念基于以下两个结构体(struct)
Clt
- 这是一个网络客户端,可以发起连接Svc
- 这是一个网络服务,它监听一个端口并为每个建立的连接创建一个Clt
- 然后,
Clt
和Svc
都提供了send
和recv
方法,其签名大致如下Clt::send(msg: &T)
与Clt::recv() -> T
- 其中T
是在实例化Clt
和Svc
时指定的泛型类型
-
本库有三个实现。点击单独的链接获取更多详细信息
- 非阻塞 - 目前这个实现是最完整的,其
send()
/recv()
方法接受一个timeout
参数。这使得应用程序开发者可以设置io
等待限制。内部实现依赖于spin
锁并等待以提供best
延迟性能,因为它不允许OS
将运行线程挂起,这会产生显著的延迟惩罚。这种实现推荐用于对low latency
性能要求的情况。 - 阻塞 - 这个实现最简单易用,因为所有方法调用都是按顺序阻塞,直到操作完成。这种易用性是以性能和可扩展性为代价的。这种实现推荐用于典型网络负载。
- 异步 - 这个实现基于 Rust 的
async
/await
tokio
框架,然而,在撰写本文时,Rust 的异步 API 仍在进行稳定化,并且尚未在stable
工具链中可用。
- 非阻塞 - 目前这个实现是最完整的,其
依赖关系
~6–19MB
~212K SLoC