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.