.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. 生信入门必须掌握的 30 个 Linux 命令

    学习生物信息,Linux 是必须掌握的内容,其实常用的 Linux 命令也就 30 个左右,而且这些命令都是单词的简写,记忆起来并不困难.这里列出了常用的 30 个命令. 1. cd Change d ...

  2. 拒绝conda, 用virtualenv构建多版本的python开发环境

    本文章转载自公众号 "生信码农笔记(ID:bio-coder)",已获得原作者授权. 1. 不喜欢用 conda 特别不喜欢 bioconda, miniconda, Anacon ...

  3. 入门 Python GUI 开发的第一个坑

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 使用 Anaconda 3(conda 4.5.11)的 tkinter python 包(c ...

  4. Adobe 构建 IDP 之路的经验与教训

    在过去的25年多时间里,我创建了软件组件和分布式框架,建立并领导了相关团队.近几年我致力于推动 Adobe 服务开发.部署和管理系统的开发人员生产力. 抽象陷阱 在云时代早期,Adobe 的每个团队都 ...

  5. 深入理解注解驱动配置与XML配置的融合与区别

    摘要:本文旨在深入探讨Spring框架的注解驱动配置与XML配置,揭示两者之间的相似性与差异. 本文分享自华为云社区<Spring高手之路2--深入理解注解驱动配置与XML配置的融合与区别> ...

  6. .NET周报 【6月第3期 2023-06-18】

    国内文章 揭秘 Task.Wait https://www.cnblogs.com/eventhorizon/p/17481757.html Task.Wait 是 Task 的一个实例方法,用于等待 ...

  7. 大数据实战手册-开发篇之RDD:计算 transform->action

    2.2 RDD:计算 transform->action 2.2.1 aggregate x = sc.parallelize([2,3,4], 2)[Task不能跨分片,task数为2] ne ...

  8. selenium元素定位---ElementClickInterceptedException(元素点击交互异常)解决方法

    1.异常原因 在编写ui自动化时,执行报错元素无法点击:ElementClickInterceptedException 具体报错:selenium.common.exceptions.Element ...

  9. ASL芯片CS5466方案设计|集睿致远CS5466代理商|Type-c转HDMI电路原理

    CS5466作为ASL集睿致远新推出的高性能Type-C to HDMI2.1协议转换器,可以通过HDMI输出端口作为TMDS或FRL发射机进行操作. CS5466适配于多个配件市场和现实应用主板,例 ...

  10. CPU性能指标介绍及分析

    CPU是计算机系统中最核心的组件之一,对系统性能起着至关重要的作用.以下是一些常见的CPU性能指标及其分析: 1. %user(用户态)和 %system(内核态) %user:表示CPU花费在用户进 ...