私はいくつかの段階を実装するためにhttps://blog.golang.org/pipelinesの記事に従っています。golangでは、次のステージの遅延を導入するパイプラインステージを作成する方法はありますか?
イベントがパイプラインの次のステージで渡されるまでに数秒の遅延を導入するステージが必要です。
私の懸念は、以下のコードでは、イベントを渡す前にtime.Sleep()という無限の数のgoルーチンを生成することです。これを行うより良い方法はありますか?
ありがとうございます!
func fooStage(inChan <- chan *Bar) (<- chan *Bar) {
out := make(chan *Bar, 10000)
go func() {
defer close(out)
wg := sync.WaitGroup{}
for {
select {
case event, ok := <-inChan:
if !ok {
// inChan closed
break
}
wg.Add(1)
go func() {
time.Sleep(5 * time.Second)
out <- event
wg.Done()
}()
}
}
wg.Wait()
}()
return out
}
ありがとう、これは良い考えのようです。私が見ることができる唯一の欠点は、 'routines'チャンネルがブロックされていると、イベントが5秒以上遅れることです。私が思うイベントの中でタイムスタンプを持たずにそれに取り組む良い方法はありません。 – ultimoo
@ultimoo 5秒待っているので、数百から数千のゴルーチンを簡単に実行することができ、実際のイベント待ち時間が短縮されます。このようなものは、コードを読むだけでは決まりません。実際にどのように動作するかを実際に判断するには、テストとベンチマークが必要になります。 – RayfenWindspear
絶対に、これはもっと多くの実験です。私の直感は、これらのgoroutineを数千回実行することはOKです。彼らが行うのは 'time.Sleep()'で実行されるので、彼らの寿命のほとんどはプロセッサ上でスケジュールされません。 – ultimoo