私の場合、私は同時にwork()
として働いている何千ものゴルーチンを持っています。私もsync()
のゴルーチンを持っていました。 sync
が起動すると、同期ジョブが完了してからしばらくの間、他のゴルーチンが一時停止する必要があります。ここに私のコードは次のとおりです。golangの他のゴルーチンを一時停止&再開するためのエレガントな方法はありますか?
var channels []chan int
var channels_mutex sync.Mutex
func work() {
channel := make(chan int, 1)
channels_mutex.Lock()
channels = append(channels, channel)
channels_mutex.Unlock()
for {
for {
sync_stat := <- channel // blocked here
if sync_stat == 0 { // if sync complete
break
}
}
// Do some jobs
if (some condition) {
return
}
}
}
func sync() {
channels_mutex.Lock()
// do some sync
for int i := 0; i != len(channels); i++ {
channels[i] <- 0
}
channels_mutex.Unlock()
}
が今の問題は<-
は常に読み取りでブロックされているので、ある、すべての時間がsync_stat := <- channel
に行くブロックしています。私はチャンネルが閉鎖されているかどうかを知っていますが、それはブロックされませんが、work()
出口までこのチャンネルを使用しなければならないので、閉鎖されたチャンネルを開く方法が見つかりませんでした。
私は間違った方法で自分自身を疑うので、どんな助けにも感謝します。 &ゴーランの他のゴルーチンを再開するには、いくつかの "エレガントな"方法がありますか?
'<-time.After(1e1)'はどういう意味ですか? –
ゴルーチンを1秒間一時停止します(1e9ナノ秒)。この例では、コントローラーが実際の作業を行っているように見えます。 'time.After()'は与えられたタイムアウトの後にシグナルを送るチャネルを返します。 '<--time.After(N)'は、そのシグナルが受信されるまで、そのチャンネルのブロックを単純にブロックします。 – jimt
これは別の考えを実現しました。なぜ、コントローラのステータスを表すグローバル値を使用していないのですか?そして、「ワーカー」は毎回グローバル値をチェックしますか?私はそれが良い習慣ではないことを知っていますが、理由を知りたいのです。 –