.NET中的绿色线程

27

绿色线程最初在Erlang中引入,可能所有基于Erlang的语言都使用它们,也包括Go(gorutines)。然后,据我所知,它们被从Rust中删除了。

我的问题:

  • 如何在.NET中实现绿色线程?是否有一些限制阻止当前的.NET运行时实现它们?
  • 从性能角度来看,这是否有意义?我们有一个相当轻量级的任务(Task),在(接近)将来,我们甚至将拥有ValueType Task(更适合某些场景)...

8
Erlang和Go不提供绿色线程。该术语被滥用过多,已失去实用性。纤程在多核时代表现不佳,将其添加到NET 2.0中的尝试失败了。使用AppDomain可以获得Erlang和Go提供的状态隔离类型。从Task类和async/await关键字中获取轻量级线程。看看Akka.NET。 - Hans Passant
如果您使用对象池来管理任务并通过缓存来提高性能,那么您就不需要绿色线程。通常情况下,通过将所有内容异步化来获得差的性能结果。异步和同步混合使用缓存将为您提供更好的性能。如果绿色线程非常有用,我相信.NET开发人员早就考虑过了。 - Akash Kava
@AkashKava 你可以通过“全部异步化”来获得相当不错的性能,尽管语言支持必须设计得非常好:http://joeduffyblog.com/2015/11/19/asynchronous-everything/ - Kyle Strand
3个回答

3
如何在.NET中实现绿色线程?有什么注意事项阻止当前的.NET运行时实现它们吗?
在.NET运行时中,通过在OS线程之上分层一个虚拟线程,并处理所有副作用/利基情况(保持堆栈帧、处理亲和性等等);最近在Java中已经实现了这一点, .NET的关键人物一直在调查
从性能的角度来看,这是否有意义?我们有一个相当轻量级的Task,在(近)将来我们甚至会有更适合某些场景的ValueType Task…
这个问题很棘手,需要进行实验才能回答;绿色线程的优点在于它可以一次到达更多的代码;但从风险/复杂性方面来看,这也是一个缺点。异步/等待涉及的机制并不简单,因此如果可以省略它,那就太好了!但在某些方面,它只是被“移动”,尽管是移动到可能被大量优化的专门代码中。但是像所有性能问题一样,答案在于数字,没有实验就无法得出数字。

0
这虽然很老,但值得指出:F#通过MailboxProcessor内置了轻量级用户模式线程。

-2
在计算机编程中,绿色线程是由运行时库或虚拟机(VM)调度的线程,而不是由底层操作系统本地调度的线程。使用.NET Framework编写的托管线程将由框架进行调度,但无论如何,Windows操作系统都将在底层运行并将线程附加到CPU(因为.NET需要Windows)。

15
自.NET Core发布近两年以来,“as NET requires Windows”这一说法显然已经不再成立。 - Richard Szalay
7
那追溯得更早了;自从2004年起,Mono就已经跨平台了。 - Mike C.
1
Oak是Java的前身,创建于1994年。Duff的设备用于协程,创建于1979年。... - mevets

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