Golang 中的并行处理:利用并发来提高性能
考虑提供的代码,其中展示了 Goroutine 的并行处理。然而,它提出了关于并发执行的潜力以及实现并行性的最佳方法的问题。
dowork 的并发执行
dowork 并行执行的前提是不保证。虽然 goroutine 提供了轻量级的并发机制,但操作系统调度程序决定了实际的执行顺序。根据 Go 1.5 的发行说明,GOMAXPROCS 通常与可用内核保持一致。
建议方法:死锁预防和并发控制
关于维护 main 函数的执行、 fmt.Scanln 可能不可靠,尤其是在生产环境中。相反,考虑实现一个sync.WaitGroup来确保所有goroutine在退出之前完成。此外,为了增强并发控制并确保并行任务的适当资源利用,建议为每个 goroutine 使用独立的 dowork Worker 通道。
用于并行函数执行的实用函数
为了简化并行函数执行,可以利用现有的实用函数,例如以下:
<code class="go">import "sync" // Parallelize parallelizes function calls func Parallelize(functions ...func()) { var waitGroup sync.WaitGroup waitGroup.Add(len(functions)) defer waitGroup.Wait() for _, function := range functions { go func(f func()) { defer waitGroup.Done() f() }(function) } }</code>
将此函数应用于代码片段:
<code class="go">func1 := func() { f(0) } func2 := func() { f(1) } func3 := func() { f(2) } Parallelize(func1, func2, func3)</code>
以上是如何在 Golang 中实现真正的并行:Goroutines、死锁和通道?的详细内容。更多信息请关注PHP中文网其他相关文章!