rust - 在 Rust 程序中同时使用 libnative 和 libgreen

标签 rust

我目前正在设计一个流程,我必须在其中生成很多 任务。这是我做出的一个概念选择,因为我知道这在 Rust 中是可能的。然而,自从默认采用 1:1 模型以来,关于 Rust 可以生成“数十万个任务”的说法已经消失。

我的问题很简单:是否可以为非 IO 生成绿色任务、为 IO 操作生成轻型任务和 native 任务?

感谢您的宝贵时间。

最佳答案

green crate 仍然存在,如果你想通过 libuv 生成“绿色线程”。但您可能不想这样做。

问题归结为 Rust 如何处理堆栈,以及它如何检测溢出。最初,Rust 使用拆分堆栈,这意味着它可以分配非常小的堆栈,因此每个绿色线程使用的内存非常少。通过显式检查检测到溢出。

问题是,事实证明这是非常低效的。更糟糕的是,它甚至使 native 线程变慢,因为代码不知道它将在哪个线程上运行。因此,Rust 放弃了保护页的拆分堆栈。也就是说,在捕获无效访问的线程堆栈下方总是有一个额外的 4K 空页面。

然而,这就是 native 线程堆栈的工作方式。因此,当更改进行时,绿色线程突然像普通线程一样内存效率低下,并且给 Rust 带来了一个大的运行时组件。

因此,为什么 green 被删除并变成一个常规的外部库。您仍然可以使用它,但是您现在还不清楚什么时候想使用它。

作为比较点,Go 最近或即将进行相同的更改。

至于“成百上千的任务”,现在的说法是,如果你想那样做,在64位环境中运行,惰性内存映射会使问题消失。希望。

编辑:作为附录,如果 Rust 确实在未来获得非常节省内存的“任务”,我个人会关注 Python 3 风格的生成器. Rust 没有很好的方法来做它们,但这就是我要花钱的地方......

关于rust - 在 Rust 程序中同时使用 libnative 和 libgreen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27039768/

相关文章:

path - 惯用地在 Rust Path 中展开波浪号

rust - 如何理解rust中的deref和所有权?

python - PyO3 将 rust 结构转换为 PyObject

rust - 静态的 future 生命周期不长

tcp - TCP 流中什么时候发生管道破裂?

rust - 你如何在 Rust 中实现这个简单的 trie 节点?

rust - Option是否保证是原子性的?

macros - 如何在不重复规则的情况下为宏编写包装器?

caching - "Expected type parameter, found reference to type parameter"实现通用缓存结构时

memory-management - Rust 会释放被覆盖变量的内存吗?