我刚刚开始学习Go。 Go的优势在于用于处理多个并发连接的goroutines。有人提到
goroutines可以看作是轻量级线程(但实际上不是线程),它们可以增加/缩小堆栈大小,并被复用到多个os线程中。假设您有1000个goroutine,则根据goroutine的阻塞和等待模式将它们安排在本机OS线程中。
基本上,我来自C#和Nodejs。我很困惑它与用C#实现的TaskParallelLibrary有何不同。
TaskParallelLibrary隐藏了创建和管理线程的复杂性。您只需启动任务,CLR就会将它们映射到本机线程。在这里您可以创建成千上万的微小任务,这些任务被映射并计划到OS线程。但是,TPL专门解决了异步问题。
我的问题是TPL与goroutines有何不同? goroutine是否使用协程(可暂停函数或?)。 TPL还将async / syscalls操作复用到线程池,即使Go也将syscall复用到线程池。
如果我的任何假设是错误的,请纠正我。有人可以在确切的实现方式上有所帮助吗?为什么goroutines声称比TPL更快?
答案 0 :(得分:4)
主要区别在于Go运行时将goroutine的调度与I / O紧密结合,基本上是这样的:如果goroutine即将在某些I / O操作或通道操作上阻塞,则调度程序会暂停该goroutine并在知道原始I / O或通道操作现在可以继续进行后重新激活它。这样就可以以纯顺序的方式编写Go代码-无需所有回调地狱和“未来” /“承诺”冲突,后者仅将回调包装到对象中,也无需使用async
/ await
机器,仅将编译器技巧与普通的OS线程结合在一起。
Dart编程语言的开发者之一在this classic piece中对这些内容进行了很好的解释。