将产生 goroutine 的 golang 方法

2024-05-24

据我所知,如果 goroutine 太忙,它们会阻止其他 goroutine 运行。对我来说,这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine(例如通常是 Read() 和 Write())

有什么方法可以让我准确地知道不同的库方法将如何控制其他 goroutine,即实际上不会阻塞?

有什么方法可以实现一个新方法来调用第三方代码(包括异步 Win32 API,如依赖于 waitforsingleobject 或 waitformultipleobjects 的 findnextchangenotification)并且与 Go 调度程序一起表现“良好”?在这个特定的示例中,系统调用一旦完成就会发出信号,我需要等到它完成而不耗尽所有其他 goroutine。

是否有另一种“最佳实践”来处理 Go 中的第三方阻塞操作,以便它们不会耗尽其他 goroutine?

我假设 Go 运行时可能在后台线程上内部运行某种 IO 循环,以便“挂起”阻塞 goroutine 操作,直到它们完成 IO。如果情况确实如此,那么我想能够以此为基础进行新的阻塞操作可能会很有用。


Go 的调度程序将挂起正在等待系统调用的 goroutine,并在系统调用完成时唤醒它们,为您提供同步 API 来处理异步调用。

阅读更多 http://morsmachine.dk/go-scheduler关于调度程序如何工作。

然而,没有确切的方法来确定哪个 Goroutine 将被唤醒,或者将控制权从一个 Goroutine 直接交给另一个 Goroutine - 这是调度程序的工作。

您关心的是 Go 中已解决的问题,您不必担心它 - 代码消失!

Edit:

进一步澄清;你不应该编写代码来遵循(或更好地利用)Go 的调度程序语义——而是相反。也许有一些代码技巧可以让你今天的性能略有提高,但调度程序可以并且将会在任何未来的 Go 版本中发生变化 - 使你的代码优化毫无用处,甚至对你不利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将产生 goroutine 的 golang 方法 的相关文章