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

Go是否会阻塞诸如Node之类的处理器密集型操作?

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

Go是否会阻塞诸如Node之类的处理器密集型操作?

是的,但是在实践中要比使用Node困难得多,并且从中恢复也要容易得多。节点是单线程的,除非您编写显式的多进程代码(这并不总是那么容易,特别是如果您希望具有可移植性)。Go使用N:M调度,并且具有一定数量的正在运行的最大线程数(默认情况下等于逻辑CPU的数量,但是可调)。注意
running :等待阻塞操作的goroutine被“冻结”,不算在占用正在运行的线程中。

因此,如果您有一个goroutine进行CPU密集型工作,那么通常不会影响其他goroutine的运行能力,因为还有很多其他线程可以运行它们。如果您
所有 的goroutine都被计算所占据,那么其他程序确实没有机会运行,直到有人放弃了CPU。如果您实际上正在完成工作,那么这可能 不一定
会成为问题,因为您的所有CPU都在进行实际工作,但是当然有时可能在对延迟敏感的情况下。

如果有问题,可以想到三种解决方案:

  1. runtime.Gosched
    在长时间计算期间使用,可以控制处理器,从而使其他goroutine可以运行。无需进行其他任何更改;这只是与合作调度程序一起工作的一种方式。
    Gosched
    可能会立即返回,也可能稍后返回。

  2. 使用工作池将并行的CPU密集型工作量限制为少于GOMAXPROCS。Go使这变得非常容易。

  3. 同一枚硬币的另一面:将GOMAXPROCS提升到并行计算任务的预期数量以上。这可能是最糟糕的主意,并且至少会在一定程度上影响调度,但是它仍然可以正常工作,并确保您有可用于处理事件的线程。



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

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

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