在Go中调用runtime.GOMAXPROCS(1)时,运行时将只为所有goroutines使用一个线程.在执行io时,您的goroutine将屈服,并让其他goroutine在同一线程上运行.

这似乎与我的 idea 非常相似.net异步CTP功能是在不使用后台线程的情况下进行协作并发.

我的问题是,你认为哪种方法比另一种方法有什么优点或缺点.

推荐答案

做出价值判断总是一件棘手的事情,所以我将强调三个不同之处.你来决定他们是属于"支持"还是"反对".

  1. 而Go和async都允许您以简单的方式编写异步代码.NET,您必须知道代码的哪部分是异步的,哪部分不是(即,您必须显式使用async/await关键字).在Go中,你不需要知道这一点——运行时让它"正常工作",没有特殊的语法来标记异步代码.

  2. 围棋设计不需要标准库中的任何特殊代码.NET需要 for each 异步操作向标准库添加新代码,实质上是将API表面积翻倍,例如有新的异步http下载API,而旧的非异步http下载API必须保留以实现向后兼容.

  3. Go的设计和实现要简单得多.一小段运行时代码(调度器)负责挂起阻塞系统调用的goroutine,并让位于Hibernate goroutine.标准库中不需要任何特殊的异步支持.

NET实现首先需要添加前面提到的新API.此外,.NET实现基于编译器将带有异步/等待的代码重写成等价的状态机.它很聪明,但也相当复杂.实际结果是,第一个异步CTP有已知的错误,而GO的实现从一开始就很正常.

归根结底,这真的无关紧要.异步/等待是用.NET编写异步代码的最佳方式.Goroutines是实现这一点的最佳方式.这两种语言都很棒,特别是与大多数其他语言的替代语言相比.

Go相关问答推荐

Golang socks 5代理,流量限制转发到下一个socks 5代理

迭代项列表时如何超时并发调用

"k8s.io/apimachinery/pkg/runtime.对象(缺少方法DeepCopyBody)

使用Gorm创建自定义连接表

从Kafka到Clickhouse的实时消费数据

GORM Find方法中缺少字段

未对GoFr中的所有请求进行跟踪

Prometheus 摘要分位数错误

该文件位于模块.内,该模块不包含在您的工作区中

使用Cookie身份验证的Gorilla Golang Websocket优化

无法将 graphql-ws 连接到 gqlgen

Golang 通过接口反映/迭代{}

如何为导入的嵌入式 struct 文字提供值?

级联调用泛型函数时的泛型类型推断

在 Raspberry Pi4 上下载 Go Mod

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

手动将 OpenTelemetry 上下文从 golang 提取到字符串中?

为什么在 goroutine 中声明时,benbjohnson/clock 模拟计时器不执行?

处理程序中的无限循环

如何动态解析 Go Fiber 中的请求正文?