.NET 8 的 green thread 异步模型被搁置了

net,green,thread,异步,模型,搁置 · 浏览次数 : 2463

小编点评

**Green Thread 异步模型实验结果** **实验结论:** * .NET平台上 Green Thread 和异步编程模型 async/await 之间的交互非常复杂。 * Green Thread 为 .NET 开发人员提供了一种简化的编程模型,可以以同步方式编写异步代码。 * Green Thread 与现有的异步编程模型 async/await 之间的交互存在一些挑战,但 Green Thread 在某些场景中可能比异步效率更高。 **主要结果:** * Green Thread 性能不如现有的异步编程模型 async/await,但仍保持了可伸缩性和性能。 * Green Thread 在与某些特定特性如线程局部静态变量和本机线程状态交互时存在功能上的问题。 * 100,000,000 次 P/Invoke 从原来的 300ms 变成需要 1800ms。 * Green Thread 模型的速度有可能超过异步,但这种性能提升的代价是其他场景下的性能下降,以及需要放弃一些兼容性和特性。 **结论:** Green Thread 是一个用于简化 .NET 开发人员编程模型的工具,但它可能在某些场景中效率较低。现有的异步编程模型 async/await 是一种更有效的选择,但 Green Thread 在某些情况下可能仍然是必要的。

正文

.NET 平台上的green thread 异步模型实验结果最近出来了,具体参见:https://github.com/dotnet/runtimelab/issues/2398 ,实验结果总结一下就是在.NET和 ASP.NET Core中实现Green Thread是可行的。Green Thread 在.NET运行时环境中的基本成本和好处,以及与异步编程模型的交互和挑战。如果引入了全新的异步编程模型,对于.NET开发人员来说,Green Thread 和现有异步模型async/await 之间的交互非常复杂。因此,决定暂停绿色线程试验,继续改进现有的async/await模型,以便在.NET中开发异步代码。

文章对为什么要进行Green thread的实验的总结一下就这么几点:

  1. .NET的异步编程模型简化了应用程序的异步代码编写,对于增强I/O绑定方案的可伸缩性非常关键。
  2. I/O绑定代码经常处于等待状态,如等待网络返回数据。异步代码提高了可伸缩性,显著降低了等待I/O的请求成本。
  3. 异步C#代码的优势是在等待I/O操作时的低成本,并且允许服务器并行处理大量请求。
  4. 但异步编码也有挑战,因为开发者需要确定哪些方法应该异步化。全面异步化不现实,因为异步方法有性能、类型限制,并且编程模型复杂。
  5. Green thread的目的是简化编程模型,使得所有代码可以以同步方式编写,但仍保持可伸缩性和性能。
  6. Green thread在其他编程环境中已经被验证为有效,现在的考虑是它是否适用于C#,特别是考虑到存在的async/await模型。

文章里也对搁置Green thread的结论总结几点:

  1. Green thread为.NET开发人员提供了一个全新的异步编程模型。 asp. net core benchmark 显示 green thread 性能不如现有的 async/await,async/await 达到 178,620 rps 的同时 green thread 只达到了 162,019 rps, .NET 平台是目前为止唯一一个同时实现了Green Thread 和async/await 异步模型的平台,这就让我们有了一个横向比较两种编程模型的平台,这也就破案了在社区中 异步编程模型哪个更快的争论,这里有个非常好的面试题就说 golang,nodejs,java等等他们实现的异步编程模型分别是哪一种,他们有什么优缺点等。
  2. Green thread与现有的异步模型之间的交互是复杂的。特别是从Green thread代码调用异步方法需要转换到异步代码的同步模式,这在常规线程上不是一个好的选择。 micro benchmark 显示深 green thread 调用栈的性能远不如深 async/await 调用链。
  3. 在Green thread模型中,与本机代码的互操作性是复杂和相对较慢的。基于P/Invoke的基准测试显示,Green thread上的操作成本明显增加。 100,000,000 次 P/Invoke 从原来的 300ms 变成需要 1800ms。
  4. Green thread在与某些特定特性如线程局部静态变量和本机线程状态交互时存在功能上的问题。 thread local 变量的支持以及暴露 native thread 状态变得非常难以实现。
  5. Green thread与某些安全缓解措施,如防止面向返回的编程的影子堆栈( shadow stacks),的交互是具有挑战性的。
  6. 在某些关键场景中,Green thread模型的速度有可能超过异步,但这种性能提升的代价是其他场景下的性能下降,以及需要放弃一些兼容性和特性。
  7. 一个未解之谜是,通过优化异步,是否可以让Green thread在性能上超过异步。
  8. 开发团队发现以上问题在其它使用 green thread 的语言中同样存在。

文章后面的讨论值得看一看,其中rcollette 的观点特别有意思:https://github.com/dotnet/runtimelab/issues/2398#issuecomment-1713003525 

这篇关于loom/Java 21的演讲对于那些希望深入了解绿色线程的人来说非常不错。 https://blog.jetbrains.com/idea/2023/05/new-livestream-virtual-threads-and-structured-concurrency-in-java-2021-with-loom/

我预计在现实世界中,它们(对现有代码)有益的情境会非常有限。你需要大量的阻塞IO,对吗?到线程池饥饿成为一个问题的程度。

在Java世界中,这很快就会发生,原因有以下几点:

  1. Java没有标准的非阻塞数据库驱动规范。Java在开始研究绿色线程之前应该先解决这个问题。容易说“你的操作持续时间太长”,但有些事务本质上运行时间很长,并且有时候你无法控制。这是主要的问题。
  2. 对于一些开发人员来说,反应式异步模式/API是一个心智跳跃,他们只是试图避免它(并不是说这是对的,但这种情况经常发生)。这比JS中的Promise嵌套还要糟糕。对于你使用的每一个方法,你都必须考虑我是否返回相同的类型,我是否返回另一个promise(Future),我是处理一个集合还是单个值,都需要不同的方法调用,等等。你还会遇到线程上下文的情况,比如事务,日志MDC等,在反应式模型中似乎毫无理由地失败,这再次让开发人员失去信心。说“他们是开发人员,他们应该做得对或离开这个行业”都把责任推到了平台开发者身上来提供优雅的解决方案。这是Java存在的一个问题,并且坦白说,我不希望这种情况在.NET中发生,因为Java中这种不够优雅的原因正是我更喜欢.NET的原因。

与.NET 8 的 green thread 异步模型被搁置了相似的内容:

.NET 8 的 green thread 异步模型被搁置了

.NET 平台上的green thread 异步模型实验结果最近出来了,具体参见:https://github.com/dotnet/runtimelab/issues/2398 ,实验结果总结一下就是在.NET和 ASP.NET Core中实现Green Thread是可行的。Green Thre

[翻译].NET 8 的原生AOT及高性能Web开发中的应用[附性能测试结果]

随着 .NET 8 的发布,微软迈出了重要一步,为 ASP.NET Core 引入了原生的 Ahead-of-Time (AOT) 编译。这一进步不仅提高了应用程序的性能,还简化了开发过程,标志着 .NET 生态系统进入了新的时代。

.NET 8 预览版 1:NativeAOT 升级和新的Blazor United

.NET团队 今天在官方博客上 发布了.NET 8的第一个预览版,.NET 8 是一个长期支持 (LTS) 版本[1],.NET 的版本包括产品、库、运行时和工具,是 Microsoft 内部和外部多个团队之间的协作。.NET 8 预览版和候选发布版本将每月交付一次,最终交付时间是今年的.NET 大

【译】VisualStudio.Extensibility 17.10:用 Diagnostics Explorer 调试您的扩展

VisualStudio. Extensibility 帮助您构建在主 IDE 进程之外运行的扩展,以提高性能和可靠性。它还提供了一个时尚而直观的基于 .NET 8 的 API 和全面且维护良好的文档,可以帮助您开发出色的扩展。

.NET 8 发布的最后一个预览版Preview 7, 下个月发布RC

微软在2023年8月9日 发布了.NET 8 Preview 7[1],这是它在11月14日 RTM 之前进入发布候选阶段之前的最后预览版。 该预览版也于也与 VS 2022 v17.7 版本一起发布。对于预览版7,System.Text.Json 和 codegen 在此版本中具有最大的变化。所有

.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!

这是我们计划在今年晚些时候发布的最终.NET 8版本之前的两个候选版本中的第一个。大部分计划中的功能和变更都包含在这个候选版本中,可以供您尝试使用。您可以在文档中找到完整的ASP.NET Core在.NET 8中的新功能列表。一些领域(尤其是Blazor)仍然有一些重大的变更待完成,我们预计将在下一

记一次asp.net 8 服务器爆满的解决过程

1.描述一下服务器配置: 一台2c4g的centos,做api接口反代 一台8c16g的windows 2019 作为实际服务器,跑了iis,sql server,mongodb,redis 2.业务描述 2.0 服务器分为两个站点:importapi:用于处理数据导入,,,webapi:用于处理对

.NET 8 RC 2 发布,将在11月14日发布正式版

微软2023-10-10 发布了 .NET 8 RC 2,下一站是.NET 8正式发布,就在下个月Net Conf 2023[1](11月14日)期间正式发布,我们也开始筹备第四届中国.NET开发者峰会了。 经过长达一年时间的开发,.NET 8 规划的所有主要的新功能都已推出,.NET 8 及其所有

ASP.NET Core 8 预览版 4的重大更新

最新版本的 .NET 8 预览版 4 对 ASP.NET Core 进行了重大改进。值得注意的增强功能包括 Blazor 的流式呈现和表单处理、在最小 API 中扩展对表单绑定的支持、用于提高性能的NativeAOT 编译、使用标识 API 终结点增强的身份验证和授权,以及添加用于应用程序监视的指标

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用