gpt4 book ai didi

multithreading - Go goroutine 是协程吗?

转载 作者:IT老高 更新时间:2023-10-28 12:58:38 24 4
gpt4 key购买 nike

在 Google I/O 2012 演示文稿中 Go Concurrency Patterns , Rob Pike 提到多个 goroutines 可以存在于一个线程中。这是否意味着它们被实现为 coroutines ?如果没有,它们是如何实现的?欢迎提供源代码链接。

最佳答案

IMO,协程意味着支持 explicit 将控制权转移到另一个协程的方法。也就是说,程序员在决定一个协程何时应该暂停执行并将其控制权传递给另一个协程(通过调用它或通过返回/退出(通常称为屈服))时,以某种方式对协程进行编程。

Go 的“goroutines”是另一回事:它们隐式在 goroutine 即将休眠时发生的某些不确定1交出控制权在一些(外部)资源上,如 I/O 完成、 channel 发送等。这种方法与通过 channel 共享状态相结合,使程序员能够将程序逻辑编写为一组 顺序 轻量级进程,从而消除协程和基于事件的方法常见的意大利面条代码问题。

关于实现,我认为它们与(不幸的是不太知名)"State Threads" library 非常相似。 ,只是相当低级(因为 Go 不依赖 libc 或类似的东西,而是直接与 OS 内核对话)——你可以阅读 ST 库的介绍性论文,其中的概念相当解释得很好。


1 事实上,这些点不如协程确定,但比 preemptive multitasking 下的真正 OS 线程更确定。 ,其中每个线程都可能在任何给定时间点和线程控制流中被内核挂起。
2021-05-28 更新: 实际上,从 Go 1.14 开始,goroutines are scheduled (almost) preemptively .不过应该注意的是,它仍然不是那种典型内核对其管理的线程进行的硬核抢占,但它比以前更接近了;至少,一旦 goroutine 进入繁忙循环,它现在不可能变成不可抢占的。

关于multithreading - Go goroutine 是协程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18058164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com