go语言的多核并行化例子

时间:2022-05-05
本文章向大家介绍go语言的多核并行化例子,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

写了个多核跑程序的例子,从《go语言编程而来》。关键就是runtime.NumCPU()读出cpu核数,runtime.GOMAXPROCS(MULTICORE)控制使用多个cpu核心。据说以后不会这么麻烦。

看了一下运行时间,其实没有变快- -可能是因为这种纯加法太简单了,作为一个例子以后需要可以看一下。

package main

import (
	"fmt"
	"runtime"
	"time"
)

const COUNT int = 100
const SIZE int = 300

func main() {
	var num [SIZE]int

	for i := 0; i < COUNT; i++ {
		num[i] = i
	}
	fmt.Println()
	fmt.Printf("result=%dn", calmul(num[0:]))
}

func calmul(num []int) int {
	t1 := time.Now()

	var MULTICORE int = runtime.NumCPU() //number of core

	runtime.GOMAXPROCS(MULTICORE) //running in multicore

	fmt.Printf("with %d coren", MULTICORE)
	ch := make(chan int)
	for i := 0; i < MULTICORE; i++ {
		go calsome(i*COUNT/MULTICORE, (i+1)*COUNT/MULTICORE, num[0:], ch)
	} //divide into some parts

	result := 0
	for i := 0; i < MULTICORE; i++ {
		temp := <-ch
		fmt.Printf("multicore #%d result:%dn", i, temp)
		result += temp
	} //read result of some part from channel,loop will stop after all is read

	t2 := time.Now()

	fmt.Printf("multicore total time:%dn", t2.Sub(t1))

	return result
}

func calsome(from, to int, num []int, ch chan int) {
	someresult := 0
	for i := from; i < to; i++ {
		someresult += num[i]
	}
	ch <- someresult //put result in channel
}