在go中调用runtime.GOMAXPROCS(1)时,运行时只会为所有goroutine使用一个线程。当你做你的goroutines会产生并让其他goroutines在同一个线程上运行。
如果您不使用后台线程,这与.net异步CTP功能如何进行协同并发非常相似。
我的问题是你能想到一种方法优于另一种方法的优点或缺点。
答案 0 :(得分:26)
做出价值判断总是一件棘手的事情,所以我要强调3个不同之处。你决定他们是属于“专业”还是“骗局”。
虽然Go和async都允许您以简单的方式编写异步代码,但在.NET中您必须知道代码的哪一部分是异步的,哪一部分不是(即您必须明确使用) async / await keywords)。在Go中你不需要知道 - 运行时使它“正常工作”,没有特殊的语法来标记异步代码。
Go design在标准库中不需要任何特殊代码。 .NET需要为每个异步操作向标准库添加新代码,对于这些情况,基本上将API表面加倍,例如有新的异步http下载API,旧的非异步http下载API必须保持向后兼容性。
Go设计和实施的规模要简单几个数量级。一小段运行时代码(调度程序)负责挂起阻塞系统调用并产生睡眠goroutine的goroutine。标准库中不需要任何特殊的异步支持。
.NET实现首先需要添加上述新API。此外,.NET实现基于编译器重写代码,异步/等待进入等效的状态机。它非常聪明但也相当复杂。实际结果是第一个异步CTP已经知道了错误,而Go的实现从一开始就起作用了。
最终,这并不重要。 async / await是在.NET中编写异步代码的最佳方法。 Goroutines是Go的最佳方式。两者都很棒,特别是与大多数其他语言的替代品相比。