- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!