M:N 线程模型(例如 goroutines)的缺点是什么?[关闭]

What are the disadvantages of an M:N threading model (e.g. goroutines)? [closed]

提问人:user200783 提问时间:7/8/2017 更新时间:7/8/2017 访问量:1564

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

6年前关闭。

M:N 线程是一种将 M 个用户线程映射到 N 个内核线程的模型。由于重量轻,因此可以创建大量 (M) 用户线程,这仍然允许 (N 向) 并行性。

这对我来说似乎是双赢的,那么为什么很少有语言/实现使用这种线程模型呢?我所知道的唯一例子是 Go 的“goroutines”和 Erlang 的流程。

M:N 线程的缺点是什么?为什么其他语言不使用这种从表面上看似乎很有前途的线程模型?

多线程 Go 语言无关 Erlang 编程语言

评论

0赞 Pouriya 7/8/2017
Rust 使用 Erlang 的 actor 模型,Rust 比 Go 更快。doc.rust-lang.org/book/second-edition/ch16-00-concurrency.html
0赞 Rick-777 7/11/2017
其他相关语言包括奥卡姆语和边缘语。
0赞 Rick-777 7/11/2017
有性能问题,也有抽象和正确性问题。不同的人对此会有不同的看法。IMO,在编写描述并发行为的代码时,使用协程 / goroutines / occam 过程等比主流的反应式/回调驱动的替代方案更容易使用。通常,轻量级线程的性能不如主流线程(可以直截了当地描述为使用操作系统线程的手动滚动方法)。但有时,如果并行执行有效,情况正好相反。/只是我的意见/。
0赞 user200783 7/12/2017
因为这个问题在 Stack Overflow 上已经关闭,所以我在这里再次问了一遍。

答:

0赞 Krzysztof Kowalczyk 7/8/2017 #1

部分原因是因为“这是其他人都在做的事情”。虽然M:N线程在Go之前就已经存在,但所有主流语言(C,C++,Perl,Java,C#,Python,Ruby,PHP)都使用线程,其中许多语言(Python,Ruby)在这方面做得很差。Go 是第一个表明 M:N 线程可以很好地工作的流行语言。

部分原因是线程是操作系统的原生基元。

实现 M:N 线程会使与操作系统代码/C 库的互操作更加困难和缓慢。在调用 C/OS 代码时,Go 必须从小型 goroutine 堆栈切换到常规 OS 堆栈。

许多其他流行的语言(Python、Ruby)比 Go 更依赖调用 C 代码的能力,因此对他们来说,对此进行优化更为重要。

良好的 M:N 线程与 OS/C 代码的互操作并非不可能(Go 做得不错),但如果你做操作系统所做的事情,那就更容易做到了。