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

原文 标签 c# multithreading go task-parallel-library

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

Goroutines can be considered as light-weight threads (but not actually threads) which can grow/shrink stack size and these are multiplexed into multiple os threads. Say if you have 1000 goroutines then these are scheduled to native OS threads based on blocking and waiting modes of goroutines.



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

TaskParallelLibrary hides the complexity of creating threads and managing them. You just start a task and CLR takes care of mapping them to native threads. Here you can create thousands of tiny tasks which are mapped and scheduled to OS threads. However TPL solves async problems specifically.



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

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

最佳答案

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

这个东东很好解释在this classic piece由 Dart 编程语言的开发人员之一编写。

另见 thisthis .

关于c# - Go 例程与任务并行库的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962682/

相关文章:

c# - 在 WinForms 中切换单选按钮

c# - 有状态表达式访问者多次运行问题

c - 在注释该线程的 pthread_join 时多次执行同一线程子例程

go - 通过值或引用传递 http.ResponseWriter?

c# - 将图像转换为byte [] C#并在android中获取图像

c# - 支持通过索引和键访问的数据结构

c++ - C++中线程计数的静态类变量

sql-server - 临时表是线程安全的吗?

javascript - Node.js:通过 unix 套接字发送 GET 请求

database - 在管道模式下上传一堆数据