为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
小怪兽爱吃肉 2023-03-21 17:07:29
我刚开始学习围棋。Go 的优势在于用于处理多个并发连接的 goroutines。有人提到Goroutines 可以被认为是轻量级线程(但实际上不是线程),它们可以增加/缩小堆栈大小,并且它们被多路复用到多个 os 线程中。假设您有 1000 个 goroutine,那么这些 goroutine 将根据 goroutine 的阻塞和等待模式调度到本机操作系统线程。基本上,我来自 C# 和 Nodejs 背景。我很困惑它与用 C# 实现的 TaskParallelLibrary 有何不同。TaskParallelLibrary 隐藏了创建线程和管理它们的复杂性。您只需启动一个任务,CLR 就会负责将它们映射到本机线程。在这里,您可以创建数以千计的小任务,这些任务被映射和调度到 OS 线程。但是 TPL 专门解决异步问题。我的问题是 TPL 与 goroutines 有何不同?goroutines 是否使用协程(可暂停函数或?)。TPL 还将异步/系统调用操作多路复用到线程池,甚至 Go 也将系统调用多路复用到线程池。如果我的任何假设是错误的,请纠正我。任何人都可以帮助我具体实施的不同之处吗?为什么 goroutines 声称比 TPL 更快?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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

Dart 编程语言的一位开发人员在这篇经典文章中很好地解释了这些东西。

另见thisthis


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信