php小编百草今天将为大家介绍C#语言中的任务 async/await与Golang语言中的goroutine。这两种技术都是用于实现并发编程的方法,能够在处理并发任务时提供更加简洁和高效的解决方案。通过使用async/await和goroutine,开发者可以轻松地编写出高性能、高并发的程序,从而提升应用程序的响应速度和用户体验。让我们一起来了解一下这两种技术的特点和使用方法吧!
问题内容
我学习 C# 和 Golang 已经有一段时间了,并尝试比较它们支持异步编程的方式。
我对 goroutine 的了解是,go 运行时可以安排 goroutine 在不同的物理/机器线程上运行。如果一个 goroutine 被阻塞(例如,同步等待 I/O),go 运行时可以挂起该 goroutine 并释放物理线程来运行其他 goroutine。
C# Task
与 goroutine 类似,因为它也是物理线程之上的抽象。然而,在 async
Task
内进行阻塞 I/O 被认为是一个坏主意,因为“整个线程将被阻塞,导致死锁”。 C#运行时不能做一些类似于goroutine的事情来挂起被阻塞的async
Task
并释放物理线程来运行其他async
Task
s吗?
我已经为这个问题苦苦挣扎了一段时间,但找不到更好地解释这个问题的公共材料。也许我的理解不正确。有人可以帮我吗?
解决方法
C# 任务与 goroutine 类似,因为它也是物理线程之上的抽象。
从极高的角度来看,是的,它们可能很相似。
但是,在异步任务中进行阻塞 I/O 被认为是一个坏主意,因为“整个线程将被阻塞,导致死锁”。
阻塞并不一定会导致死锁,但阻塞会阻塞调用线程,直到任务完成。这就是重点。
C# 运行时不能做类似于 goroutine 的事情来挂起阻塞的异步任务并释放物理线程来运行其他异步任务吗?
异步方法只需使用 await
即可获得您想要的行为。阻塞专门用于阻塞线程。从概念上讲,goroutine 有点像让每个方法都为 async
并在各处隐式使用 await
。
在更一般的情况下,C# 运行时会执行类似于 goroutine 的操作来处理任何阻塞:由于向后兼容性,C# 运行时无法轻松执行此操作。还有很多遗留代码依赖于“特殊线程”(UI 线程、COM STA 线程等),其中绿色线程/协程方法会更加困难。 Go 通过创建一个全新的生态系统基本上避免了向后不兼容的问题。
以上就是C# 任务 async/await 与 Golang 的 goroutine的详细内容,更多请关注编程网其它相关文章!