【问题标题】:Green threads in .NET.NET 中的绿色线程
【发布时间】:2016-09-14 02:22:54
【问题描述】:

绿色线程是在 Erlang 中引入的,可能所有基于它的语言都知道它们,在 go (gorutines) 中也是如此。然后 afaik 他们被除锈了。

我的问题:

  • 如何在 .NET 中实现绿色线程?是否有一些警告会阻止当前的 .NET 运行时实现它们?
  • 它在性能方面是否有意义?我们有一个非常轻量级的任务,在(不久的)将来我们甚至会有 ValueType 任务(更适合某些场景)...

【问题讨论】:

  • Erlang 和 Go 不提供绿色线程。该术语被滥用太多而无用。 Fiber 在多核时代表现不佳,尝试将其添加到 NET 2.0 的尝试以失败告终。使用 AppDomain 获得 Erlang 和 Go 提供的那种状态隔离。从 Task 类和 async/await 关键字中获取轻量级线程。看看 Akka.NET
  • 如果您使用对象池来管理任务并通过缓存提高性能,则不需要绿色线程。性能不佳通常是因为一切都是异步的。异步和同步与缓存的混合将为您提供更好的性能。如果绿色线程有什么大用处,我相信 .NET 开发人员早就考虑过。
  • @AkashKava 您可以从“异步执行所有操作”中获得相当不错的性能,尽管语言支持必须经过精心设计:joeduffyblog.com/2015/11/19/asynchronous-everything

标签: .net multithreading concurrency clr


【解决方案1】:

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

【讨论】:

  • “因为 NET 需要 Windows”,自从 .NET Core 近两年前发布以来,这显然不是真的。
  • 可以追溯到更远的地方;自 2004 年以来,Mono 一直是跨平台的?
  • Oak,Java的前身; 1994. Duff 的协同程序设备,1979; ...
【解决方案2】:

这是非常古老但值得指出的:F# 具有通过 MailboxProcessor 内置的轻量级用户模式线程。

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2022-12-01
    • 2013-02-22
    相关资源
    最近更新 更多