2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
編寫代碼時(shí)我必須做些什么,
不。
還是全部由調(diào)度程序處理?
是的。
在下面的示例中,我有兩個(gè)使用 go 關(guān)鍵字在單獨(dú)的 Go 例程中運(yùn)行的函數(shù)。因?yàn)槟J(rèn)的 GOMAXPROCS 是您機(jī)器上可用的處理器數(shù)量(我也明確設(shè)置了它)我希望這兩個(gè)函數(shù)同時(shí)運(yùn)行
他們可能會(huì)也可能不會(huì),你在這里無法控制。
因此輸出將是特定順序的數(shù)字混合 - 此外,每次運(yùn)行時(shí)輸出都會(huì)不同。然而,這種情況并非如此。相反,它們一個(gè)接一個(gè)地運(yùn)行,更令人困惑的是,功能二在功能一之前運(yùn)行。
是的。同樣,您不能強(qiáng)制并行計(jì)算。
你的測試是有缺陷的:你只是在每個(gè) goroutine 中做的不多。在您的示例中,goroutine 2 可能被安排在 goroutine 1 開始運(yùn)行之前運(yùn)行、開始運(yùn)行并完成?!皢?dòng)”一個(gè) goroutinego
并不強(qiáng)制它立即開始執(zhí)行,所做的只是創(chuàng)建一個(gè)可以運(yùn)行的新 goroutine。從所有可以運(yùn)行的 goroutine 中,一些被調(diào)度到你的處理器上。所有這些調(diào)度都無法控制,它是全自動(dòng)的。如您所知,這是并發(fā)和并行之間的區(qū)別。您可以控制 Go 中的并發(fā)性,但不能(太多)控制在兩個(gè)或更多內(nèi)核上實(shí)際并行完成的工作。
具有實(shí)際工作的長期運(yùn)行的 goroutine 的更實(shí)際示例將顯示交錯(cuò)輸出。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
這一切都由調(diào)度程序處理。
只有 20 條短指令的兩個(gè)循環(huán),您將很難看到并發(fā)或并行的效果。
這是另一個(gè)玩具示例: https: //play.golang.org/p/xPKITzKACZp
package main
import (
"fmt"
"runtime"
"sync"
"sync/atomic"
"time"
)
const (
ConstMaxProcs = 2
ConstRunners = 4
ConstLoopcount = 1_000_000
)
func runner(id int, wg *sync.WaitGroup, cptr *int64) {
var times int
for i := 0; i < ConstLoopcount; i++ {
val := atomic.AddInt64(cptr, 1)
if val > 1 {
times++
}
atomic.AddInt64(cptr, -1)
}
fmt.Printf("[runner %d] cptr was > 1 on %d occasions\n", id, times)
wg.Done()
}
func main() {
runtime.GOMAXPROCS(ConstMaxProcs)
var cptr int64
wg := &sync.WaitGroup{}
wg.Add(ConstRunners)
start := time.Now()
for id := 1; id <= ConstRunners; id++ {
go runner(id, wg, &cptr)
}
wg.Wait()
fmt.Printf("completed in %s\n", time.Now().Sub(start))
}
與您的示例一樣:您無法控制調(diào)度程序,此示例只是有更多“表面”來見證并發(fā)的一些影響。
很難從程序內(nèi)部看到并發(fā)性和并行性之間的實(shí)際差異,您可以在處理器運(yùn)行時(shí)查看處理器的活動(dòng),或檢查全局執(zhí)行時(shí)間。
Playground 的時(shí)鐘不提供亞秒級(jí)精度,如果您想查看實(shí)際時(shí)間,請(qǐng)將代碼復(fù)制/粘貼到本地文件中并調(diào)整常量以查看各種效果。
請(qǐng)注意,其他一些影響(可能:if val > 1 {...}檢查的分支預(yù)測和/或共享變量周圍的內(nèi)存失效cptr)使我的機(jī)器上的執(zhí)行非常不穩(wěn)定,所以不要指望直接“使用 ConstMaxProcs = 4 運(yùn)行比快 4 倍ConstMaxProcs = 1"。
- 2 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報(bào)