Documentation ¶
Overview ¶
Package signals には、シグナル関連の処理が存在します.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Ready ¶
type Ready struct {
// contains filtered or unexported fields
}
Ready は、処理が始まったことを他のゴルーチンに知らせたい場合に利用できる簡易イベントです.
Ready は、一度 Signal すると完了状態から戻ることはありません。 何度も、待機と通知を繰り返したい場合は *sync.Cond の利用を検討してください。
Example ¶
package main import ( "fmt" "sync" "time" "github.com/devlights/gomy/signals" ) func main() { // 以下は処理の開始を待つゴルーチンが複数存在する状態で // 値を提供するゴルーチンが自身の準備が整った後 *signals.Ready を用いて // 待機しているゴルーチンに開始許可を通知する例です. var ( wg sync.WaitGroup // 消費者側ゴルーチンの完了待機用 ) // Producer ready, values := func() (*signals.Ready, <-chan int) { ready := signals.NewReady() values := make(chan int) go func() { defer close(values) // 開始まで時間が掛かる処理をシミュレート time.Sleep(2 * time.Second) // 待機している他のゴルーチンに開始許可を通知 ready.Signal() for _, v := range []int{1, 2, 3, 4, 5} { values <- v // 各ゴルーチンが値を受け取れるように意図的に少し間を空ける time.Sleep(20 * time.Millisecond) } }() return ready, values }() // Consumer for _, i := range []int{1, 2, 3} { wg.Add(1) go func(i int) { defer wg.Done() // 開始許可が出るまで待機 fmt.Printf("[%d]:待機開始\n", i) ready.Wait() fmt.Printf("[%d]:待機解除\n", i) for v := range values { fmt.Println(v) } }(i) } wg.Wait() }
Output: [1]:待機開始 [2]:待機開始 [3]:待機開始 [1]:待機解除 [2]:待機解除 [3]:待機解除 1 2 3 4 5
Click to show internal directories.
Click to hide internal directories.