GolangでGoキーワードとChannelを使用して並列化
Goキーワードとチャンネルの使い方
goキーワードはgoroutine(コラボレーション)を作成するために使用され、同時実行を実現する鍵です.goキーワードの使い方は以下の通りです.
//go goroutine
go GetThingDone(param1, param2);
// ,
go func(param1, param2) {
}(val1, val2)
// goroutine goroutine
go {
//do someting...
}
goroutineはマルチコアcpu環境で並列であるためである.コードブロックが複数のgoroutineで実行されると,コード並列化が実現される.では、問題が来ました.どうやって並列の結果を手に入れますか?これでチャンネルを使わなければなりません.
//resultChan int channel。 , int 。
var resultChan chan int
// 123 ,
resultChan
goキーワードとchannelを使用して非ブロック呼び出しを実現
ブロックとは、呼び出し元が呼び出されたコードが戻るまで待たなければならず、他のことを処理できないことを意味する.ブロック呼び出しではなく待機する必要はなく、呼び出し後すぐに戻ります.では、戻り値はどのように取得されますか?Node.jsはコールバック方式、Golangはchannelを使用しています.
/**
* channel : resultChan,
* goroutine http 。
* goroutine resultChan。
*/
func UnblockGet(requestUrl string) chan string {
resultChan := make(chan string)
go func() {
request := httplib.Get(requestUrl)
content, err := request.String()
if err != nil {
content = "" + err.Error()
}
resultChan
新しいgoroutineは関数のメインフローの実行をブロックしないため、UnblockGetメソッドを呼び出すとすぐにresultChanの戻り値が得られます.goroutine実行が完了すると結果がresultChanに書き込まれ、外部からresultChanから実行結果が取得されます.
非常にlowの並列例
fmt.Println(time.Now())
resultChan1 := UnblockGet("http://127.0.0.1/test.php?i=1")
resultChan2 := UnblockGet("http://127.0.0.1/test.php?i=2")
fmt.Println(
上記の2つのhttpリクエストは、2つのgoroutineで並列に行われています.合計実行時間は、2つのリクエスト時間とより小さい.
この例はgoとchannelの使い方を体現するためだけで、メモリの漏れの問題があって、決してオンラインでこのようにしないでください.新しいchannelにはcloseがないからです.今度はもっと高級なものを書きます.
http multi GETを簡単に実現
type RemoteResult struct {
Url string
Result string
}
func RemoteGet(requestUrl string, resultChan chan RemoteResult) {
request := httplib.NewBeegoRequest(requestUrl, "GET")
request.SetTimeout(2 * time.Second, 5 * time.Second)
//request.String()
content, err := request.String()
if err != nil {
content = "" + err.Error()
}
resultChan