主頁 > 知識庫 > golang中的并發(fā)和并行

golang中的并發(fā)和并行

熱門標簽:網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 AI電銷 百度競價排名 Linux服務器 呼叫中心市場需求 鐵路電話系統(tǒng) 服務外包

golang中默認使用一個CPU,這時程序無法并發(fā),只能是并發(fā)。因為始終只有一個CPU在運行。

package main 
import (
        "fmt"
        "runtime"
)
 
//并發(fā)和并行
var quit chan int = make(chan int) 
func loop() {
        for i := 0; i  100; i++ { //為了觀察,跑多些
                fmt.Printf("%d ", i)
        }
        quit - 0
}
 
func main() {
        runtime.GOMAXPROCS(2) // 最多使用2個核
 
        go loop()
        go loop()
 
        for i := 0; i  2; i++ {
                - quit
        }
}

runtime.GOMAXPROCS(2) 設置使用2個CPU,這才真正是并行。

補充:Go多核并行化

通過goroutine創(chuàng)建相同邏輯CPU核心個數(shù)的協(xié)程,將求和列表分段,分別計算后匯總。

通過runtime.NUMCPU()獲得邏輯CPU個數(shù),并計算每個協(xié)程中計算列表的下標,計算完成后,向channel中寫入1。

通過向channel中讀取int的個數(shù),判斷協(xié)程運行是否全部完成,之后求和即可。

package main
import (
	"fmt"
	"runtime"
)
type Vector []float64
func (v Vector) DoSome(p, i, n int, u Vector, c chan int) {
	sum := 0.0
	for ; i  n; i++ {
		sum += u[i]
	}
	v[p] = sum
	c - 1
}
const NCPU = 4
func (v Vector) DoAll(u Vector) {
	c := make(chan int, NCPU)
	for i := 0; i  NCPU; i++ {
		fmt.Println(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU)
		go v.DoSome(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU, u, c)
	}
	for i := 0; i  NCPU; i++ {
		-c
	}
	sum := 0.0
	for _, value := range v {
		sum += value
	}
	fmt.Println(sum)
}
func main() {
	u := make([]float64, 64)
	for i := 0; i  64; i++ {
		u[i] = float64(i)
	}
	var v Vector = make([]float64, NCPU)
	v.DoAll(u)
	ncpu := runtime.NumCPU()
	fmt.Println(ncpu)
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 關于golang高并發(fā)的實現(xiàn)與注意事項說明
  • 基于Golang 高并發(fā)問題的解決方案
  • 使用golang編寫一個并發(fā)工作隊列
  • golang 并發(fā)編程之生產(chǎn)者消費者詳解
  • Golang 并發(fā)以及通道的使用方式
  • 快速解決Golang Map 并發(fā)讀寫安全的問題
  • 淺談golang并發(fā)操作變量安全的問題

標簽:仙桃 銅川 黃山 蘭州 衡水 湘潭 崇左 湖南

巨人網(wǎng)絡通訊聲明:本文標題《golang中的并發(fā)和并行》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266