.net Async和google go轻量级线程的主要区别是什么?

本文关键字:区别 是什么 线程 Async google go 轻量级 net | 更新日期: 2023-09-27 18:08:59

在go中调用runtime. gomaxprocs(1)时,运行时将只使用一个线程用于所有的goout程。当你执行io时,你的例程会让步,并让其他例程在同一线程上运行。

如果你不使用后台线程,这对我来说似乎非常类似于。net异步CTP功能是如何进行协作并发的。

我的问题是你认为一种方法比另一种方法有哪些优点或缺点。

.net Async和google go轻量级线程的主要区别是什么?

做出价值判断总是一件棘手的事情,所以我将强调3个不同点。你决定他们属于"赞成"还是"反对"范畴。

  1. 虽然Go和async都允许你以一种直接的方式编写异步代码,但在。net中,你必须知道代码的哪一部分是异步的,哪一部分不是(即你必须显式地使用async/await关键字)。在Go中,你不需要知道这些——运行时使它"正常工作",没有特殊的语法来标记异步代码。

  2. Go的设计不需要在标准库中添加任何特殊的代码,. net需要为每个异步操作添加新的代码到标准库中,实质上是在这些情况下加倍API表面,例如有新的异步http下载API,而旧的非异步http下载API必须保留以向后兼容。

  3. Go的设计和实现是简单的数量级。一小段运行时代码(调度器)负责挂起阻塞系统调用的运行例程,并让位于休眠运行例程。在标准库中不需要任何特殊的异步支持

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

最终,这并不重要。async/await是在。net中编写异步代码的最佳方式。在Go中,Go例程是实现这一点的最好方法。两者都很棒,特别是与大多数其他语言的替代品相比。