【问题标题】:Implementation of Go-routines vs Task Parallel LibraryGo-routines 与任务并行库的实现
【发布时间】:2018-08-22 08:25:34
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • goroutines 在哪里声称比 TPL 更快?
  • @Adrian 我已经提到如果我的假设是错误的,请纠正我。对不起,这是我的假设
  • 引用的关于 Go 的段落指出,goroutines 比 threads 更有效,它们确实如此。我不知道有任何官方声明将 goroutines 与 TPL 进行比较。
  • @Adrian 你认为 goroutines 和 TPL 是一回事吗?
  • 不,goroutines 是 Go 的一个特性,TPL 是 C# 的一个特性,它们是相同基本编程概念的完全独立和不同的实现。我认为没有人会声称它们是相同的,尽管有些人可能会声称它们大致相同。

标签: c# multithreading go task-parallel-library


【解决方案1】:

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

Dart 编程语言的一位开发人员在this classic piece 中很好地解释了这些东西。

另见thisthis

【讨论】:

  • 另一方面,async/await 与特定操作无关(如果 Task 不是正确的抽象,您甚至可以编写自己的等待对象)并且如果您重新做对了,你最终不会捆绑any threads at all。至少目前在 C# 中实现。
  • 是的,这听起来像 async/await
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多