Rust 的异步为什么要把网络库重新写一遍? 为什么rust tokio写异步程序需要引入额外的库,比如网络io要tokio::net 而golang的goroutine可以直接用标准库,而不用区… 显示全部 关注者 168 被浏览 以下是我的回答,会带一些个人主观偏见评论。 actix-web 国外开发者用得最多的应该是 actix-web。你能在很多 rust 的开源高星项目中找到他的影子。印象中他也是最快的框架之一。 tokio axum axum 是 tokio 出品的 web 框架,因为 tokio 官方的品牌效应,axum 也是 rust 中使用的比较多的一个框架。不过它的 版本. Actix-web 自己加了一层runtime将线程作为actor来管理多个线程,每个线程实际跑的都是tokio的单线程block_on,这样线程之间就没法任务窃取了,失去了tokio任务调度的优势,换取了无线程上下文切换的性能。 这是actix-web和其他框架的主要区别。 axum则是完全利用tokio。 Diesel-async 和 tokio-postgres 支持查询管道。 值得注意的是, sqlx 和 sea-orm 不支持此功能。 关于异步数据库库的(非)必要性的说明 在性能方面,经常有人声称异步数据库驱动程序的性能明显优于其同步对应物。 在撰写本文时,这似乎在 rust 生态系统中并不成立。 Rust 的哲学是,如果 rust 不能确定我提供一个 runtime/调度器在任何情况下都是最好的,那就不提供,留给大家慢慢研究。 rust 的异步 runtime 实现主流是 tokio,传闻其实现是高仿了 goroutine,同样地,这满足了也许 99% 的服务端程序,顺带这也说明 goroutine 确实很好。 像issue里那样刷新重启运行时,配合mimalloc或malloc_trim (0)可以几乎释放所有内存,开销也还好基本就毫秒级,不过对代码侵入比较大,而且每次刷新都相当于重启服务了,也不算是个好的实践。 除非能够在tokio底层解决,比如把旧运行时里正在运行的协程任务无锁零拷贝转移到新的运行时里,一个. Tokio::task::spawn_blocking:这个函数并不每次都创建新的线程,而是将任务提交到 tokio 的线程池 中执行。 线程池里的线程是可以被复用的,所以在任务结束后,线程不会立即销毁。 这个设计提高了线程的复用性,减少了线程的创建和销毁的开销。 Incomplete redis client and server implementation using tokio - for learning purposes only 这个项目之所以适合新手,是因为官方提供了非常详细的文档,结合文档学习体验非常棒! tutorial | tokio - an asynchronous rust runtime 3 简历专用项目
Tokio In Aufruhr Krisenstimmung In Tokio Jetzt Drängt Japan Trump
Rust 的异步为什么要把网络库重新写一遍? 为什么rust tokio写异步程序需要引入额外的库,比如网络io要tokio::net 而golang的goroutine可以直接用标准库,而不用区… 显示全部 关注者 168 被浏览 以下是我的回答,会带一些个人主观偏见评论。 actix-web 国外开发者用得最多的应该是 actix-web。你能在很多 rust 的开源高星项目中找到他的影子。印象中他也是最快的框架之一。 tokio axum axum 是 tokio 出品的 web 框架,因为 tokio 官方的品牌效应,axum...