.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 异步模型被搁置了的更多相关文章

  1. Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别

    Task C# 多线程和异步模型 TPL模型   Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...

  2. JavaScript 学习笔记之线程异步模型

    核心的javascript程序语言并没有包含任何的线程机制,客户端javascript程序也没有任何关于线程的定义,事件驱动模式下的javascript语言并不能实现同时执行,即不能同时执行两个及以上 ...

  3. Netty 异步模型

    简介 Netty中的 I/O 操作是异步的, 包括 Bind.Write.Connect 等操作会简单的返回一个ChannelFuture. 调用者不能立刻获得结果, 而是通过Future-Liste ...

  4. ​结合异步模型,再次总结Netty多线程编码最佳实践

    更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:​​结合异步模型,再次总结Netty多线程编码最 ...

  5. 以两种异步模型应用案例,深度解析Future接口

    摘要:本文以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类. 本文分享自华为云社区<[精通高并发系列]两种异步模型与深度解析Future接口(一) ...

  6. 【高并发】两种异步模型与深度解析Future接口

    大家好,我是冰河~~ 本文有点长,但是满满的干货,以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来,打开你的IDE,跟着文章看源码,相 ...

  7. .NET - 基于事件的异步模型

    注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...

  8. Task C# 多线程和异步模型 TPL模型

    Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task TaskCompletionSource 更通用, ...

  9. Android多线程分析之一:使用Thread异步下载图像

    Android多线程分析之一:使用Thread异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处   打算整理一下对 Android F ...

  10. libgo协程库:网络性能完爆ASIO异步模型(-O3测试)

    在purecpp社区的github组织中有一个协程库:https://github.com/yyzybb537/libgo 近日有用户找到我,想要了解一下libgo库在网络方面的性能,于是选取已入选标 ...

随机推荐

  1. 你还在用Object.equals()方法吗?

    前言 当<阿里巴巴Java开发手册>发布后,我也是仔细进行了阅读,想从中找出一些"标准",让自己的代码质量提高.手册中对 Object 的 equals 方法的使用进行 ...

  2. 【python基础】循环语句-continue关键字

    1.continue关键字 continue关键字的作用是:用来告诉 Python 跳过当前循环代码块中的剩余语句,然后继续进行下一轮循环. 其在while循环和for循环中的作用示意图如下 我们通过 ...

  3. WPF中实现含有中心点Slider双向滑动条

    想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...

  4. CANoe学习笔记(五):Diva自动化测试工程

    内容: Diva工程的建立 Diva工程的配置 测试条例选择 一.新建一个Diva工程 左上角选择New,然后配置好下面部分 二.配置Diva工程 1. 2. 3.配置一些时间参数,按需求填写 4.其 ...

  5. 文字生成图像 AI免费工具第一弹 StableDiffusion

    随着ChatGPT的爆火,text-to-image文字生成图像.以及更广义的AIGC(AI Generated Content)相关的话题最近一直热度不减.相信大家这几天经常会在各类的自媒体.甚至是 ...

  6. "Process finished with exit code 1" 进程结束

    问题描述 :  springboot     程序运行出现以下情况 没有错误日志  返回运行结束 状态码  1     状态码为 1 的时候表示程序不是异常终止 连接到目标VM, 地址: ''127. ...

  7. SpringBoot 多环境切换

    日常开发中一般都会有三个不同的环境,分别是开发环境(dev),测试环境(test)和生产环境(prod),不同的环境各种配置都不相同,比如数据库配置,服务器端口等等. Spring Boot 多环境配 ...

  8. 手把手教你自定义自己SpringBoot Starter组件源码剖析

    我们知道SpringBoot Starter也就是启动器.是SpringBoot组件化的一大优点.基于这个思想,基于这个思想SpringBoot 才变得非常强大,官方给我们提供很多开箱即用的启动器. ...

  9. 使用SpringBoot+React搭建一个Excel报表平台

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 Excel报表平台是一款功能强大.操作简单的系统平台,可 ...

  10. 华为P9黑屏的解决方案-更换屏幕

    解决办法(系统软件) 1.回退系统版本,b198或者b139固件. 2.升级版本,到最新版本.新版本使用时并没有发现这个问题. 解决方法(系统设置) 点开设置-电池-选择进入超级省电模式,然后退出超级 ...