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

C# Go例程与任务并行库的实现,c#,multithreading,go,task-parallel-library,C#,Multithreading,Go,Task Parallel Library,我刚开始学围棋。Go的优势在于处理多个并发连接的goroutine。有人提到过 goroutine可以被认为是轻量级线程(但实际上不是线程),它可以增加/缩小堆栈大小,并且这些线程被多路复用到多个os线程中。假设您有1000个goroutine,那么这些goroutine将根据goroutine的阻塞和等待模式调度到本机OS线程 基本上,我来自C#和Nodejs的背景。我很困惑它与C#中实现的TaskParallelLibrary有何不同 TaskParallelLibrary隐藏了创建和管理线

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

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

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

TaskParallelLibrary隐藏了创建和管理线程的复杂性。您只需启动一个任务,CLR负责将它们映射到本机线程。在这里,您可以创建数千个映射和调度到操作系统线程的微小任务。然而,TPL专门解决异步问题

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


如果我的任何假设是错误的,请纠正我。有谁能帮我解释一下具体实现的不同之处吗?为什么goroutine声称比TPL更快?

主要区别在于Go运行时将goroutine的调度与I/O紧密耦合,基本上是这样工作的:如果goroutine将阻塞某些I/O操作或通道操作,一旦调度程序知道原始I/O或通道操作现在可以继续,它将暂停该goroutine并重新激活它。这允许以完全顺序的方式编写Go代码,而不需要所有回调地狱和“未来”/“承诺”kludges,它们只将回调封装到对象中,也不需要
async
/
wait
机制,它们同样只会将编译器技巧与普通操作系统线程结合起来

Dart编程语言的一位开发人员很好地解释了这一点


另一方面,
async
/
await
与特定的操作无关(如果
Task
不是正确的抽象,您甚至可以编写自己的可等待项),如果您做得正确,您最终不会被束缚。至少是目前在C#中实现的。是的,这听起来像是异步/等待。goroutines声称在哪里比TPL更快?@Adrian我已经提到了,如果我的假设是错误的,请纠正我。抱歉,这是我的假设,引用的关于Go的段落指出Goroutine比线程更高效,而线程正是如此。我不知道有任何官方声明将goroutines与TPL进行比较。@Adrian你认为goroutines和TPL是一个整体吗?不,goroutines是Go的一个功能,TPL是C#的一个功能,它们完全是相同基本编程概念的不同实现。我不认为有人会说它们是同一件事,尽管有些人可能会说它们大致相当。