第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

它是并發(fā)的,但是是什么讓它并行運(yùn)行呢?

它是并發(fā)的,但是是什么讓它并行運(yùn)行呢?

Go
溫溫醬 2022-07-11 15:03:05
因此,我在學(xué)習(xí) Go 的同時(shí)試圖了解并行計(jì)算的工作原理。我理解并發(fā)性和并行性之間的區(qū)別,但是,我有點(diǎn)堅(jiān)持的是 Go(或操作系統(tǒng))如何確定應(yīng)該并行執(zhí)行的東西......編寫代碼時(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)行,因此輸出將是特定順序的數(shù)字混合 - 并且此外,每次運(yùn)行時(shí)輸出都會(huì)不同。然而,這種情況并非如此。相反,它們一個(gè)接一個(gè)地運(yùn)行,更令人困惑的是,功能二在功能一之前運(yùn)行。代碼:func main() {    runtime.GOMAXPROCS(6)    var wg sync.WaitGroup    wg.Add(2)    fmt.Println("Starting")    go func() {        defer wg.Done()        for smallNum := 0; smallNum < 20; smallNum++ {            fmt.Printf("%v ", smallNum)        }    }()    go func() {        defer wg.Done()        for bigNum := 100; bigNum > 80; bigNum-- {            fmt.Printf("%v ", bigNum)        }    }()    fmt.Println("Waiting to finish")    wg.Wait()    fmt.Println("\nFinished, Now terminating")}輸出:go run main.goStartingWaiting to finish100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Finished, Now terminating我正在關(guān)注這篇文章,盡管我遇到的幾乎每個(gè)示例都做類似的事情。 并發(fā)、Goroutines 和 GOMAXPROCS這是應(yīng)該的工作方式,我沒有正確理解某些東西,還是我的代碼不正確?
查看完整描述

2 回答

?
qq_笑_17

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ò)輸出。


查看完整回答
反對(duì) 回復(fù) 2022-07-11
?
婷婷同學(xué)_

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"。


查看完整回答
反對(duì) 回復(fù) 2022-07-11
  • 2 回答
  • 0 關(guān)注
  • 144 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)