golang 典型併發任務

2022-03-27 20:32:40 字數 2376 閱讀 4864

目錄僅需任意任務完成

所有任務都完成

物件池懶漢式,執行緒安全

適用於只執行一次的任務,比如載入配置檔案。

package main

import (

"fmt"

"math/rand"

"sync"

"time"

)func init()

func main() )

}}

這裡所有任務都完成了,但是只用了最快的乙個結果,所以是所有任務都完成了;

當有乙個任務完成時,取消其他任務,因為任務都是有開銷的。

package main

import (

"fmt"

"runtime"

"time"

)func runtask(id int) string

func firstresponse() string (i)

} return <-ch

}func main()

基於csp實現

package main

import (

"fmt"

"sync"

)func main() ()

}()} counter := 0

for i := 0; i < max; i++

fmt.println("counter:", counter)

}

waitgroup實現

package main

import (

"fmt"

"sync"

)func main() ()

counter++

}(i)

} wg.wait()

fmt.println("counter:", counter)

}

適合通過復用降低複雜物件的建立和gc的代價

協程安全,會有鎖的開銷

生命週期受gc影響,不適合做連線池等需要自己管理生命週期的資源的池化。

基於buffered channel實現物件池,取用完後放回channel

package object_pool

import (

"errors"

"fmt"

"testing"

"time"

)type reusableobject struct

type objectpool struct

func newobjectpool(numofobject int) *objectpool

objectpool.bufchan = make(chan *reusableobject, numofobject)

for i := 0; i < numofobject; i++

} return &objectpool

}func (pool *objectpool) getobject(timeout time.duration) (*reusableobject, error)

}func (pool *objectpool) releaseobject(object *reusableobject) error

}func testobjpool(t *testing.t) ); err != nil

for i := 0; i < 11; i++ else

} }fmt.println("done")

}

每次獲取物件,可能會受鎖的限制,所以是建立物件的開銷大,還是鎖帶來的開銷大需要根據實際情況權衡。

package main

import (

"fmt"

"runtime"

"sync"

)func syncpool() ,

} v := pool.get().(int)

fmt.println(v)

pool.put(3)

runtime.gc() //gc 會清除sync.pool中快取的物件

v1, _ := pool.get().(int)

fmt.println(v1)

}func syncpoolinmultigoroutine() ,

} pool.put(1)

pool.put(2)

pool.put(3)

pool.put(4)

var wg sync.waitgroup

for i := 0; i < 10; i++ (i)

} wg.wait()

}func main()

golang 閒談併發

對於併發這個概念,我想大家都對它不會陌生,今天就從簡單的火車站賣票問題出發,來談談併發。首先宣告本文的 是golang 因為最近開始用的就是golang 對於其他的語言其實也是相通的,那麼正式開始正題吧,首先我們來看看,賣一張票,總票數就減一,一般來說我們會這麼寫 package main impo...

golang 併發實踐

golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...

GoLang 併發小結

006.併發 1 概念 1.1 goroutine是go並行設計的核心,goroutine的本質是輕量級執行緒 1.2 golang的runtime實現了對輕量級執行緒即goroutine的智慧型排程管理 1.3 p m g原理 1.3.1 runtime有p m g三個概念,p對應作業系統程序 對...