NET异步和GoogleGo轻量级线程的主要区别是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (7)

当调用runtime.GOMAXPROCS(1)时,运行时将只为你的所有goroutine使用一个线程。在进行io时,你的goroutines会屈服,让其他goroutines在同一个线程上运行。

这和我看起来非常相似,如果你不使用后台线程,.net异步CTP功能是如何进行协作并发的。

我的问题是你认为哪种优点或缺点可以考虑一种方法。

提问于
用户回答回答于

做出价值判断总是一件棘手的事情,所以我会强调3个不同之处。你决定他们是否陷入“专业”或“骗局”的桶。

  1. 尽管Go和async都允许您以直接的方式编写异步代码,但在.NET中,必须知道代码的哪部分是异步的,哪一部分是异步的(即,必须明确使用async / await关键字)。在Go中,不需要知道 - 运行时使其“只是工作”,没有特殊的语法来标记异步代码。
  2. Go设计不需要标准库中的任何特殊代码。.NET需要为标准库中的每个异步操作添加新代码,这些情况实质上会使API表面翻一番,例如,新的异步http下载API和旧的非异步http下载API必须保持向后兼容。
  3. Go的设计和实现简单得多。一小段运行时代码(调度程序)负责暂停阻塞系统调用的goroutine并让步睡眠goroutines。标准库中不需要任何特殊的异步支持。

.NET实现首先需要添加前面提到的新API。此外,.NET实现基于编译器重写代码,将异步/等待转换为等效的状态机。它非常聪明,但也相当复杂。实际结果是,第一个异步CTP已经知道错误,而Go的实现从一开始就工作得非常好。

最终,这并不重要。异步/等待是在.NET中编写异步代码的最佳方式。Goroutines是在Go中获得的最佳方式。两者都很好,特别是与大多数其他语言的替代品相比。

扫码关注云+社区