好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > golang中的并發和并行

golang中的并發和并行

熱門標簽:電話機器人軟件免費 評價高的400電話辦理 涿州代理外呼系統 壽光微信地圖標注 百度地圖標注后傳給手機 外呼系統用什么卡 excel地圖標注分布數據 外呼系統顯本地手機號 阿克蘇地圖標注

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

package main 
import (
        "fmt"
        "runtime"
)
 
//并發和并行
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創建相同邏輯CPU核心個數的協程,將求和列表分段,分別計算后匯總。

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

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

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)
}

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

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

標簽:欽州 汕頭 重慶 銅川 吐魯番 梅河口 蘭州 雞西

巨人網絡通訊聲明:本文標題《golang中的并發和并行》,本文關鍵詞  golang,中的,并發,和,并行,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang中的并發和并行》相關的同類信息!
  • 本頁收集關于golang中的并發和并行的相關信息資訊供網民參考!
  • 推薦文章