libgreen发生了什么?

29
据我所知,libgreen 不再是Rust标准库的一部分。此外,我找不到单独的libgreen软件包。有一些替代方案-协程,目前不提供实际的绿色线程,以及green-rs,它已经损坏了。那么,我是否正确地理解,在Rust中现在没有类似Go的轻量级进程?

3
另外还有几件相关的事情:threadpoolmio - Chris Morgan
2
赞同Chris的评论:当涉及到绿色线程时,没有一种通用的解决方案,因此您必须选择权衡。 - Matthieu M.
3个回答

22

你说得没错,在 std(或其他主要发行版)中没有轻量级任务库,green 无法编译,coroutine 似乎还不能完全处理线程方面的问题。我不知道在这个领域中是否有其他库。

至于发生了什么:那个问题链接的 RFC - RFC 230 - 是信息的权威来源。总结是发现了处理绿色线程/IO的方法(std 尝试跨越两种模型进行抽象,使它们可以自动间接使用)不值得其缺点。现在,std 的目标只是提供最小的有用支持基线:对于 IO/线程,这意味着提供“薄”,安全的操作系统功能包装器。


19

请阅读这篇文章https://aturon.github.io/blog/2016/08/11/futures/,还有:

Steve Klabnik在评论中的回复

在开始时,Rust只有绿色线程。最终,我们决定一个没有系统线程的系统语言是奇怪的,所以我们需要添加它们。为什么不提供选择呢?既然接口可以相同,为什么不对它们进行抽象,然后您可以选择想要的那个呢?
与此同时,默认情况下使用绿色线程的问题正在变得越来越严重。分段堆栈会导致缓慢的C交互。您需要运行时来管理它们等等。此外,总体抽象导致了不可接受的成本。绿色线程并不是非常“绿色”。此外,由于需要实际发布,因此需要就权衡做出决策。而且,由于Rust应该是一种系统语言,因此具有1:1线程和基本上没有运行时比N:M线程和运行时更有意义。因此,libgreen被删除,接口被重新设计为1:1线程中心。
“即将发布”的部分很重要。我们希望Rust非常稳定,而且在实际发布1.0时要做的所有事情中,我们不想确定一个我们不满意的接口。我们甚至出于类似原因删除了许多更不重要的库,例如rand。工程学涉及权衡,我们决定选择极简主义。
对于我们来说,mio不可行,因为我们需要Windows,此外,我们不想被锁定在一个昂贵且可能会被遗弃的库中。
这里完全可以理解,尤其是在一般情况下。在特定情况下,mio要么具有Windows支持,要么将发布适用于Windows的特定版本,其中高级包提供所有平台的功能。而且,在这种情况下,它由目前在生产中大量使用Rust的人之一维护,因此不太可能很快消失。但是,除非您积极参与,否则很难知道诸如此类的事情,这本身就是一个问题。
我们感到舒适删除libgreen的原因之一是您可以编写自己的库来执行不同类型的IO。 1.0是我们永远稳定的强大核心,而不是最终的结果。像https://github.com/carllerche/mio这样的库可以测试处理异步IO等事物的不同方式,而且当它们足够成熟时,我们总是可以将它们拉回标准库中。但是在此期间,只需向Cargo.toml添加一行即可。

还有这样的来自Reddit的文本

很遗憾,他们最终取消了greenlet的支持,因为它们比内核线程更慢,这表明有人不知道如何让语言编译器有效地生成stackless协程(这并不令人惊讶,天生具备这种能力的工程师并不多,但请参阅http://www.reddit.com/r/rust/comments/2l0a4b/do_rust_web_servers_use_libuv_through_libgreen_or/以获取更多详细信息)。他们还取消了异步I/O,因为libuv“慢”(这是因为它只是单线程,并且每个异步操作都需要一个malloc + free,因为缓冲区必须保持到完成发生,而且它强制执行与同步I/O相比的惩罚,详见http://blog.kazuhooku.com/2014/09/the-reasons-why-i-stopped-using-libuv.html),这真是太可惜了——他们应该抓住机会用更好的东西替换libuv(提示:ASIO + AFIO,我知道它们都是C++,但Rust可以做得比现在更好的C++互操作性),而不是在可能成为超越C++的惊人进步的过程中取消always-async-everything,同时获得大部分Erlang的优点,而没有Erlang的缺点。

同样在这个链接中,"我们放心删除libgreen的原因之一是您可以编写自己的库来执行不同类型的IO操作”。就像C++一样,(green)线程可能首先作为一个库实现。 - ArtemGr
5
我在那篇文章上留了一些评论,我认为这只是一个不完整的观点。 - Steve Klabnik
@SteveKlabnik,你在那篇文章中的评论对我很有帮助。很高兴回来看到事情就是这样发展的 :) - Jack O'Connor
感谢 @JackO'Connor! - Steve Klabnik
Erlang 的缺点是什么?例如是什么?我不会编写或了解 Erlang,只是好奇,并不想引发语言争论。 - Zac B
@ZacB 我也不。 - rofrol

9

对于新手来说,现在有一个叫做 may 的crate,它实现了类似goroutines的绿色线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接