在Go中调用runtime.GOMAXPROCS(1)时,运行时将只为所有goroutines使用一个线程.在执行io时,您的goroutine将屈服,并让其他goroutine在同一线程上运行.
这似乎与我的 idea 非常相似.net异步CTP功能是在不使用后台线程的情况下进行协作并发.
我的问题是,你认为哪种方法比另一种方法有什么优点或缺点.
在Go中调用runtime.GOMAXPROCS(1)时,运行时将只为所有goroutines使用一个线程.在执行io时,您的goroutine将屈服,并让其他goroutine在同一线程上运行.
这似乎与我的 idea 非常相似.net异步CTP功能是在不使用后台线程的情况下进行协作并发.
我的问题是,你认为哪种方法比另一种方法有什么优点或缺点.
做出价值判断总是一件棘手的事情,所以我将强调三个不同之处.你来决定他们是属于"支持"还是"反对".
而Go和async都允许您以简单的方式编写异步代码.NET,您必须知道代码的哪部分是异步的,哪部分不是(即,您必须显式使用async/await关键字).在Go中,你不需要知道这一点——运行时让它"正常工作",没有特殊的语法来标记异步代码.
围棋设计不需要标准库中的任何特殊代码.NET需要 for each 异步操作向标准库添加新代码,实质上是将API表面积翻倍,例如有新的异步http下载API,而旧的非异步http下载API必须保留以实现向后兼容.
Go的设计和实现要简单得多.一小段运行时代码(调度器)负责挂起阻塞系统调用的goroutine,并让位于Hibernate goroutine.标准库中不需要任何特殊的异步支持.
NET实现首先需要添加前面提到的新API.此外,.NET实现基于编译器将带有异步/等待的代码重写成等价的状态机.它很聪明,但也相当复杂.实际结果是,第一个异步CTP有已知的错误,而GO的实现从一开始就很正常.
归根结底,这真的无关紧要.异步/等待是用.NET编写异步代码的最佳方式.Goroutines是实现这一点的最佳方式.这两种语言都很棒,特别是与大多数其他语言的替代语言相比.