gpt4 book ai didi

multithreading - 在 goroutine 中执行 I/O 时,Go 会阻塞当前线程吗?

转载 作者:IT老高 更新时间:2023-10-28 13:00:50 25 4
gpt4 key购买 nike

我对 Go 如何处理非阻塞 I/O 感到困惑。 Go 的 API 在我看来大多是同步的,在 Go 上观看演示文稿时,经常听到诸如“和调用 block ”之类的评论。

从文件或网络读取时,Go 是否使用阻塞 I/O?或者在 goroutine 中使用时是否有某种魔法可以重写代码?

来自 C# 背景,这感觉非常不直观,因为在 C# 中,我们在使用异步 API 时有 await 关键字,它清楚地表明 API 可以产生当前线程并稍后在一个继续。

TLDR;在 goroutine 中执行 I/O 时,Go 会阻塞当前线程吗?还是会使用 continuation 将其转换为类似 C# 的 async/await 状态机?

最佳答案

Go 有一个调度程序,可让您编写同步代码,并自行进行上下文切换,并在后台使用异步 I/O。因此,如果您正在运行多个 goroutine,它们可能会在单个系统线程上运行,并且当您的代码从 goroutine 的 View 中阻塞时,它并不是真正的阻塞。这不是魔法,但是是的,它掩盖了所有这些东西。

调度程序将在需要时分配系统线程,以及在真正阻塞的操作期间(例如,文件 I/O 阻塞或调用 C 代码)。但如果你在做一些简单的 http 服务器,你可以拥有成千上万的 goroutines,实际上是使用少数“真正的线程”。

您可以阅读有关 Go 内部工作原理的更多信息 here .

关于multithreading - 在 goroutine 中执行 I/O 时,Go 会阻塞当前线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36112445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com