给定以下代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
for i := 0; i < 3; i++ {
go f(i)
}
// prevent main from exiting immediately
var input string
fmt.Scanln(&input)
}
func f(n int) {
for i := 0; i < 10; i++ {
dowork(n, i)
amt := time.Duration(rand.Intn(250))
time.Sleep(time.Millisecond * amt)
}
}
func dowork(goroutine, loopindex int) {
// simulate work
time.Sleep(time.Second * time.Duration(5))
fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}
我可以假设'dowork'函数将并行执行吗?
这是实现并行性的正确方法吗?还是为每个goroutine使用通道和单独的“dowork”工作者更好?
5条答案
按热度按时间gywdnpxw1#
关于
GOMAXPROCS
,你可以在Go 1.5的发布文档中找到:默认情况下,Go程序运行时GOMAXPROCS设置为可用的内核数量;在以前的版本中,它默认为1。
关于防止
main
函数立即退出,您可以利用WaitGroup
的Wait
函数。我写了这个实用函数来帮助并行化一组函数:
所以在你的情况下,我们可以这样做
如果你想使用Parallelize函数,你可以在这里找到https://github.com/shomali11/util
vu8f3i0k2#
这个答案已经过时了。请参见this answer。
您的代码将并发运行,但不是并行运行。您可以通过设置
GOMAXPROCS
使其并行运行。目前还不清楚您在这里究竟要实现什么,但在我看来,这是一种实现并发性的非常有效的方法。
1u4esq0p3#
f()
将同时执行,但许多dowork()
将在每个f()
中顺序执行。等待stdin也不是确保例程完成执行的正确方法。您必须启动一个通道,当f()
完成时,每个f()
都将true
推入。在main()
结束时,您必须在通道上等待n个true
。n是你旋转的f()
的数量。mzsu5hc04#
这在我刚开始的时候帮助了我。
传统的基于集群的系统(如超级计算机)使用MPI在处理器之间进行并行执行。MPI是在不同处理器上的操作系统示例中执行的进程之间的通信接口;它不支持其他进程操作,如调度。(冒着使事情进一步复杂化的风险,因为MPI进程由操作系统执行,所以单个处理器可以运行多个MPI进程和/或单个MPI进程也可以执行多个线程!)”
5jvtdoz25#
你可以在最后添加一个循环,阻塞直到任务完成: