golang设置CPU核数

前端之家收集整理的这篇文章主要介绍了golang设置CPU核数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

众所周知,golang低版本需要自己手动设置cpu核数,才能保证并发的执行

packagemain

import(
	"errors"
	"fmt"
	"runtime"
	"strconv"
	"strings"
	"testing"
)

funcmain(){
	t:=&testing.T{}
	TestSetcpu(t)
}

funcTestSetcpu(t*testing.T){
	currentcpu:=runtime.GOMAXPROCS(-1)
	maxcpu:=runtime.Numcpu()
	halfcpu:=int(0.5*float32(maxcpu))
	ifhalfcpu<1{
		halfcpu=1
	}
	fori,test:=range[]struct{
		inputstring
		outputint
		shouldErrbool
	}{
		{"1",1,false},{"-1",currentcpu,true},{"0",{"100%",maxcpu,{"50%",halfcpu,{"110%",{"-10%",{"invalidinput",{"invalidinput%",{"9999",//overavailablecpu
	}{
		err:=setcpu(test.input)
		iftest.shouldErr&&err==nil{
			fmt.Printf("Test%d:Expectederror,buttherewasn'tany",i)
		}
		if!test.shouldErr&&err!=nil{
			fmt.Printf("Test%d:Expectednoerror,buttherewasone:%v",i,err)
		}
		ifactual,expected:=runtime.GOMAXPROCS(-1),test.output;actual!=expected{
			fmt.Printf("Test%d:GOMAXPROCSwas%dbutexpected%d",actual,expected)
		}else{
			fmt.Printf("--%v%v\n",expected)
		}
		//teardown
		runtime.GOMAXPROCS(currentcpu)
	}
}

funcsetcpu(cpustring)error{
	varnumcpuint

	availcpu:=runtime.Numcpu()

	ifstrings.HasSuffix(cpu,"%"){
		//Percent
		varpercentfloat32
		pctStr:=cpu[:len(cpu)-1]
		pctInt,err:=strconv.Atoi(pctStr)
		iferr!=nil||pctInt<1||pctInt>100{
			returnerrors.New("invalidcpuvalue:percentagemustbebetween1-100")
		}
		percent=float32(pctInt)/100
		numcpu=int(float32(availcpu)*percent)
	}else{
		//Number
		num,err:=strconv.Atoi(cpu)
		iferr!=nil||num<1{
			returnerrors.New("invalidcpuvalue:provideanumberorpercentgreaterthan0")
		}
		numcpu=num
	}

	ifnumcpu>availcpu{
		numcpu=availcpu
	}

	runtime.GOMAXPROCS(numcpu)
	returnnil
}

关于golang的GOMAXPROCS的申明:

// GOMAXPROCS sets the maximum number of cpus that can be executing

// simultaneously and returns the prevIoUs setting. If n < 1,it does not

// change the current setting.

// The number of logical cpus on the local machine can be queried with Numcpu.

// This call will go away when the scheduler improves.

原文链接:https://www.f2er.com/go/190083.html

猜你在找的Go相关文章