代码之家  ›  专栏  ›  技术社区  ›  user3205479

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

  •  1
  • user3205479  · 技术社区  · 6 年前

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

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

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

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

    如果我的任何假设是错误的,请纠正我。有谁能帮我看看具体的实现有什么不同吗?为什么goroutines声称比TPL快?

    1 回复  |  直到 6 年前
        1
  •  5
  •   kostix    6 年前

    主要区别在于Go运行时将goroutine的调度与I/O紧密地耦合在一起,基本上是这样工作的:如果goroutine即将阻塞某个I/O操作或某个通道操作,调度器将挂起goroutine,并在知道原始I/O或通道操作现在可以继续时重新激活它。这允许用纯顺序的方式编写Go代码,而不需要所有的回调地狱和“未来”和“承诺”kludges,这只是将回调包装成对象,而且也不需要 async / await 机器,再一次,仅仅是将编译器技巧与纯操作系统线程耦合起来。

    this classic piece 由Dart编程语言的一位开发人员编写。

    另见 this this .