チャネル結果を完了時にキューに追加するより慣用的な方法
質問
だから、今、私はキューオブジェクトにポインターを渡すだけです(実装は実際には重要ではありません)。 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つはチャンネルを閉じる責任がある必要があります。また、プロセスオブジェクトが完了する前に、以前の改訂が終了します。ゴロウチンを同期することを選択した方法は、クリーンアップが適切に完了するようにダミー値を通過するさらにいくつかのチャネルを作成することです。これらのチャネルは、送信がロックステップで発生するように特別にバッファーされていません。
所属していません StackOverflow