猿问

Go 例程与任务并行库的实现

我刚开始学习围棋。Go 的优势在于用于处理多个并发连接的 goroutines。有人提到

Goroutines 可以被认为是轻量级线程(但实际上不是线程),它们可以增加/缩小堆栈大小,并且它们被多路复用到多个 os 线程中。假设您有 1000 个 goroutine,那么这些 goroutine 将根据 goroutine 的阻塞和等待模式调度到本机操作系统线程。

基本上,我来自 C# 和 Nodejs 背景。我很困惑它与用 C# 实现的 TaskParallelLibrary 有何不同。

TaskParallelLibrary 隐藏了创建线程和管理它们的复杂性。您只需启动一个任务,CLR 就会负责将它们映射到本机线程。在这里,您可以创建数以千计的小任务,这些任务被映射和调度到 OS 线程。但是 TPL 专门解决异步问题。

我的问题是 TPL 与 goroutines 有何不同?goroutines 是否使用协程(可暂停函数或?)。TPL 还将异步/系统调用操作多路复用到线程池,甚至 Go 也将系统调用多路复用到线程池。

如果我的任何假设是错误的,请纠正我。任何人都可以帮助我具体实施的不同之处吗?为什么 goroutines 声称比 TPL 更快?


小怪兽爱吃肉
浏览 71回答 1
1回答

翻阅古今

主要区别在于 Go 运行时将 goroutine 的调度与 I/O 紧密耦合,基本上是这样工作的:如果 goroutine 将要阻塞某些 I/O 操作或通道操作,调度程序会挂起该 goroutine 并重新一旦知道原来的 I/O 或通道操作现在可以继续,就会激活它。这允许以纯顺序的方式编写 Go 代码——没有所有的回调地狱和“未来”/“承诺”kludges,它们只是将回调包装到对象中,也没有 / 机制,这再次只是将编译器技巧与普通操作系统线程结合async起来await。Dart 编程语言的一位开发人员在这篇经典文章中很好地解释了这些东西。另见this和this。
随时随地看视频慕课网APP

相关分类

Go
我要回答