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