栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Goroutine是协作调度的。这是否意味着不执行的goroutine将导致goroutine逐一运行?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Goroutine是协作调度的。这是否意味着不执行的goroutine将导致goroutine逐一运行?

克里克所有评论的汇编和整理。

抢占式意味着内核(运行时)允许线程运行特定时间,然后在其他线程不做任何事情或一无所知的情况下将其执行。在OS内核中,通常使用硬件中断来实现。进程不能阻止整个操作系统。在协作式多任务处理中,线程必须显式地让他人执行。如果不是这样,它可能会阻塞整个过程甚至整个机器。Go就是这样做的。它在goroutine可以产生执行的一些非常特定的点。但是,如果goroutine仅针对{}执行,那么它将锁定整个过程。

但是,引用中没有提及运行时中的最新更改。

fmt.Println(sum)
可能导致其他goroutine被调度,因为较新的运行时将在函数调用时调用调度程序。

如果您没有任何函数调用,只需进行一些数学运算,那么是的,goroutine将锁定线程,直到其退出或命中可能使他人执行的东西。这就是为什么

for{}
在Go中不起作用。更糟糕的是,由于GO的工作原理,即使GOMAXPROCS>
1,它仍然会导致进程挂起,但是无论如何您都不应依赖于此。很高兴了解这些东西,但不要指望它。甚至有建议在像您这样的循环中插入调度程序调用

Go的运行时所做的主要事情是尽其所能,使每个人都可以执行而不会饿死任何人。语言规范中未对此进行规定,并且将来可能会更改。如果关于循环的提议将被实施,那么即使没有函数调用也可能发生切换。目前,您唯一需要记住的是,在某些情况下,函数调用可能导致goroutine产生执行。

为了解释Akavall的答案中的切换,当

fmt.Printf
被调用时,它要做的第一件事是检查是否需要增加堆栈并调用调度程序。它可能会切换到另一个goroutine。是否切换取决于其他goroutine的状态以及调度程序的确切实现。像任何调度程序一样,它可能会检查是否有饥饿的goroutines应该执行。在许多迭代中,函数调用有更大的机会进行切换,因为其他人的饥饿时间更长。经过几次迭代,goroutine在饥饿发生之前就完成了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452356.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号