这是我参与更文挑战的第19天,活动详情查看:更文挑战
怎么控制CPU的数量?
多个CPU能够同时执行多个协程,具体的控制通过改变GOMAXPROCS参数设置,默认是当前cpu的核数。如果程序有并行执行的可能,程序应在多CPU机器上实现。要更改使用的并行CPU的数量,请设置环境变量或使用运行时(runtime)包的类似命名功能来配置,来支持不同数量的线程。将其设置为1,表示取消并行,强制Goroutines轮流执行(串行了)。
运行时可以分配比GomaxProcs的值更多的线程来服务多个未完成的I / O请求。 GomaxProcs仅影响Goroutines在一次执行的数量。参数随意设置的话,可能导致系统调用阻塞。
Go的Goroutine 调度还不是很完美,尽管它一直在改善。 将来,它会更好地优化OS线程使用方面。 目前,如果存在性能问题,则按应用程序的基础设置GomaxProcs,可能有所帮助。
为什么没有goroutine的id?
Goroutines没有名字,它们匿名的。 它没有没有唯一标识符、名称或数据结构。 有些人对此感到惊讶,期待Go声明返回一些可用于访问和控制Goroutine的物品。
基本的原因是当编写并发代码的时候,匿名的goroutines能够使用完整功能的Go语言,相反的,就可能限制写代码所使用的库。(PS:为什么呢?)
原文我觉得写的不太好。。真的不太好。百度了一下其他博主写的原因,感觉比较有价值,大家可以参考看看。
根据官方的相关资料显示,Go 语言刻意没有提供 goid 的原因是为了避免被滥用。因为大部分用户在轻松拿到 goid 之后,在之后的编程中会不自觉地编写出强依赖 goid 的代码。强依赖 goid 将导致这些代码不好移植,同时也会导致并发模型复杂化。同时,Go 语言中可能同时存在海量的 Goroutine,但是每个 Goroutine 何时被销毁并不好实时监控,这也会导致依赖 goid 的资源无法很好地自动回收(需要手工回收)。
anonymous 无名的
illustration 插图、说明
复制代码