signals

package
v0.4.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 17, 2022 License: MIT Imports: 0 Imported by: 0

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

func NewReady

func NewReady() *Ready

NewReady は、新しい *signals.Ready を生成して返します.

func (*Ready) Signal

func (me *Ready) Signal()

Signal は、処理を開始するための準備が整ったことを通知します.

func (*Ready) Wait

func (me *Ready) Wait()

Wait は、他のゴルーチンが Signal するまで待ちます.

本メソッドは、Signal メソッドがコールされるまで呼び出し元をブロックします。

一度 Signal された以降に本メソッドを呼び出すと即座に処理を返します。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL