チャネル結果を完了時にキューに追加するより慣用的な方法

StackOverflow https://stackoverflow.com/questions/3129940

  •  01-10-2019
  •  | 
  •  

質問

だから、今、私はキューオブジェクトにポインターを渡すだけです(実装は実際には重要ではありません)。 queue.add(result) ゴルチンの終わりに、キューに物を追加するはずです。

同じ種類の機能が必要です。もちろん、コンマOK構文でループチェック完了を行うことは、パフォーマンスと単純なキュー追加機能呼び出しの点で受け入れられません。

これをより良くする方法はありますか?

役に立ちましたか?

解決

実際には、質問には2つの部分があります。1つのキューデータをどのようにキューにし、ブロックせずにチャネルをどのように使用しますか。

最初の部分では、チャンネルを使用してキューに物事を追加する代わりに、チャンネルをキューとして使用するのではなく、必要なことが必要です。例えば:

var (
    ch = make(chan int) // You can add an int parameter to this make call to create a buffered channel

    // Do not buffer these channels!
    gFinished = make(chan bool)
    processFinished = make(chan bool)
)
func f() {
    go g()
    for {
        // send values over ch here...
    }
    <-gFinished
    close(ch)
}
func g() {
    // create more expensive objects...
    gFinished <- true
}
func processObjects() {
    for val := range ch {
        // Process each val here
    }
    processFinished <- true
}
func main() {
    go processObjects()
    f()
    <-processFinished
}

これをより非同期にする方法については、(CTHOM06が指摘したように)2番目の整数をに渡すことができます make チャネルのバッファーがいっぱいになるまで、操作を非同期に送信する2行目を呼び出します。

編集: ただし(CTHOM06も指摘したように)、チャンネルに2つのゴルチンが書いているため、そのうちの1つはチャンネルを閉じる責任がある必要があります。また、プロセスオブジェクトが完了する前に、以前の改訂が終了します。ゴロウチンを同期することを選択した方法は、クリーンアップが適切に完了するようにダミー値を通過するさらにいくつかのチャネルを作成することです。これらのチャネルは、送信がロックステップで発生するように特別にバッファーされていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top