据我所知,libgreen 不再是Rust标准库的一部分。此外,我找不到单独的libgreen软件包。有一些替代方案-协程,目前不提供实际的绿色线程,以及green-rs,它已经损坏了。那么,我是否正确地理解,在Rust中现在没有类似Go的轻量级进程?
你说得没错,在 std
(或其他主要发行版)中没有轻量级任务库,green
无法编译,coroutine
似乎还不能完全处理线程方面的问题。我不知道在这个领域中是否有其他库。
至于发生了什么:那个问题链接的 RFC - RFC 230 - 是信息的权威来源。总结是发现了处理绿色线程/IO的方法(std
尝试跨越两种模型进行抽象,使它们可以自动间接使用)不值得其缺点。现在,std
的目标只是提供最小的有用支持基线:对于 IO/线程,这意味着提供“薄”,安全的操作系统功能包装器。
请阅读这篇文章https://aturon.github.io/blog/2016/08/11/futures/,还有:
在开始时,Rust只有绿色线程。最终,我们决定一个没有系统线程的系统语言是奇怪的,所以我们需要添加它们。为什么不提供选择呢?既然接口可以相同,为什么不对它们进行抽象,然后您可以选择想要的那个呢?还有这样的来自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的缺点。