主要观点总结
本文介绍了Go语言推出的新提案,该提案提供了主线程API的控制功能,旨在满足某些依赖于主线程的C库或GUI库的需求。新提案通过引入mainthread包来实现,该包提供在主线程上调度函数的能力以及一些管理主线程运行顺序的机制。
关键观点总结
关键观点1: 背景介绍
文章首先介绍了为何需要控制主线程的背景,尤其是针对某些API(如macOS的AppKit和iOS的UIKit)需要对启动线程进行独占控制的需求。
关键观点2: 现有设计的问题
现有的设计不允许非主线程包控制主线程,这影响了对主线程API的使用并可能影响用户体验。
关键观点3: 新提案的提出
针对上述问题,提出了新提案,该提案主要通过引入新的mainthread包来解决非主线程包控制主线程的需求。
关键观点4: mainthread包的功能与特点
新提案中的mainthread包提供了确保特定代码在主线程上运行的能力,并提供了在主线程上调度函数的能力以及一些管理主线程运行顺序的机制。核心函数包括Do、Yield和Waiting。
关键观点5: 争议与讨论
虽然新提案有其应用场景(如GUI程序和Windows服务),但一些开发者对其普遍适用性表示质疑。此外,关于在init函数中调用该API可能导致的潜在问题也引发了讨论。
文章预览
↓推荐关注↓ 大家好,我是煎鱼。 国庆的时候看到了一个较少见的提案,Go 竟然会提供主线程 API 的控制(说好的不对外...),还是挺有意思的。 本提案已经 Accepted,会进入 Go 主版本特性。今天分享给大家,一起围观学习一下! 背景 某些 API(尤其是 macOS 的 AppKit 和 iOS 的 UIKit)需要对启动线程进行独占控制 。Go 已经支持此类 API,如果在 init 函数中调用了 runtime.LockOSThread ,就会指定主函数在主线程上运行。 但是, 现有的设计不允许非主线程包控制主线程 ,因此任何对主线程 API 的使用都会影响到用户。(本次新提案将对此做出调整) 例如,这是 Gio 当前用于创建和驱动 GUI 窗口的 API: import "gioui.org/app" func main () { go func () { w := new (app.Window) for { e := w.NextEvent()
………………………………