golang 协程调度 帮忙翻译理解下

2018-10-24 19:09:32 +08:00
 helloworld12

if you run any tight loops that are not making function calls, you will cause latencies within the scheduler and garbage collection

是说,如果你循环中没有进行函数调用,那么调度或者垃圾回收时,会有延时 ?

看了上下文,说当函数调用的时候,有协程调度的埋点,这样的话,如果循环中没有函数调用,就不会有调度的延时啊?

It ’ s critically important that function calls happen within reasonable timeframes.

是说,如果函数调用频度要合理,不要过多,也不要过少吗?

2322 次点击
所在节点    Go 编程语言
5 条回复
xiaxiaocao
2018-10-24 19:23:56 +08:00
没有埋点一个协程就会一直占了 P 啊,P 队列上其他的协程就没机会执行了
Leigg
2018-10-24 19:50:36 +08:00
gc 本就是针对变量,函数一类对象的,gc 是有开销的,不会很频繁的执行,字面意思你没翻译错。
TheCure
2018-10-24 19:58:24 +08:00
调度器发现一个 routine 运行了很久需要暂停的时候, 会给这个 routine 设置一个 flag. 在 function call 的时候, 会去检查这个 flag, 然后决定是否暂停运行.
像 java 里的 GC Pause, 也需要执行到 safepoint 的时候,停止运行, 虽然 go 用的是协程, 但是和这个 GC Pause 也类似
TheCure
2018-10-24 19:59:43 +08:00
所以给的建议是, 如果很蠢的写了一个 for 循环, 里面都是 i++这种没有发生函数调用, 也不可能阻塞的代码, 这个 routine 会一直跑下去.
reus
2018-10-25 00:27:53 +08:00
https://github.com/golang/proposal/blob/master/design/24543-non-cooperative-preemption.md

Proposal: Non-cooperative goroutine preemption

很可能 1.12 就会实现,所以探讨这些没什么意义,这些知识很快就会过时。
goroutine 不是协程。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/500783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX