2017-06-10 12 views
-1

私は16個のgoルーチンを持っています。通常はstructです。goルーチンのGolang順出力

struct output{ 
index int, 
description string, 
} 

は今、これらすべての16のゴールーチンは、並列に実行し、すべてのゴールーチンからの総期待される出力構造体は、万人と予想されます。私はそれを行うには非常に高価ですgo langの基本的な並べ替えを使用して、いくつかのインデックスに基づいて出力を並べ替えるために取る方法で私を助けることができると私はファイルに "記述"フィールドを書く必要があります索引の順序で。例えば

、 ゴールーチンは{2、 "こんにちは"}として出力を与える場合は、{9、 "ねえ"}、{4、 "はいはい"}、私の出力ファイルは、ちょっと こんにちは はいはい が含まれている必要があります

これらのすべてのgoルーチンは並行して実行され、実行順序を制御することはできません。したがって、索引を渡して最終的に出力を順序付けします。

+0

PriorityQueue:https://golang.org/pkg/container/heap/#example__priorityQueue –

+0

各ゴルーチンが独自の出力を並べ替えてから結果をマージするとどうなりますか?並行して並べ替えが行われるため、いくらかの改善が得られるかもしれません。基数ソートを試行して、典型的なO(N * log(N))ソートよりも優れたパフォーマンスを発揮するかどうかを調べることもできます。 –

答えて

1

答えに入る前に考慮すべきことの1つは、サンプルコードがコンパイルされないことです。囲碁における構造体のタイプを定義するには、あなたの問題への潜在的な解決策の面では

type output struct { 
    index  int 
    description string 
} 

にあなたの構文を変更する必要があります - あなたはすでに確実に一意のインデックスのと同様に、結果の予想数を持っている場合設定すると、並べ替えを一切行う必要はありません。代わりに、チャネル上でgoルーチンを同期させ、それぞれのインデックスに割り当てられたスライスに出力を挿入します。そのスライスを反復して内容をファイルに書き込むことができます。例:

ch := make(chan output) //each go routine will write to this channel 
wg := new(sync.WaitGroup) //wait group to sync all go routines 

//execute 16 goroutines 
for i := 0; i < 16; i++ { 
    wg.Add(1) 
    go worker(ch, wg) //this is expecting each worker func to call wg.Done() when completing its portion of work 
} 

//create a "quit" channel that will be used to signal to the select statement below that your go routines are all done 
quit := make(chan bool) 
go func() { 
    wg.Wait() 
    quit <- true 
}() 

//initialize a slice with length and capacity to 1mil, the expected result size mentioned in your question 
sorted := make([]string, 1000000, 1000000) 

//use the for loop, select pattern to sync the results from your 16 go routines and insert them into the sorted slice 
for { 
    select { 
     case output := <-ch: 
      //this is not robust - check notes below example 
      sorted[output.index] = output.description 
     case <-quit: 
      //implement a function you could pass the sorted slice to that will write the results 
      // Ex: writeToFile(sorted) 
      return 
    } 
} 

このソリューションに関するいくつかの注意事項:予想される結果セットのサイズを知っているかどうかに依存します。結果セットのサイズがわからない場合は、selectステートメントで、chからのインデックスが読み取られているかどうかをチェックして、sortedスライスの長さを超えて、挿入する前に追加のスペースを割り当てなければなりません。範囲外エラーの結果

関連する問題