latch

package
v0.5.3 Latest Latest
Warning

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

Go to latest
Published: Sep 7, 2022 License: MIT Imports: 1 Imported by: 0

Documentation

Overview

Package latch には、ラッチ関連の処理が存在します.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type CountDownLatch

type CountDownLatch struct {
	// contains filtered or unexported fields
}

CountDownLatch は、指定されたカウント数分の非同期処理が完了するまで 1つ以上のゴルーチンを待機させる非同期イベントです。

Javaの java.util.concurrent.CountDownLatch を参考にしています。

REF: https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CountDownLatch.html

NewCountDownLatch(int) でラッチを生成し、非同期処理側で CountDown() を呼び出します。 生成時に指定したカウント数分の CountDown() 呼び出しが実施されたタイミングでラッチがオープンとなります。

非同期処理の完了を待機する側は Await() を呼び出し、取得したチャネルを監視します。 ラッチがオープンとなったタイミングで、このチャネルはクローズされます。

Example
package main

import (
	"log"
	"os"
	"sync"
	"time"

	"github.com/devlights/gomy/latch"
)

func main() {
	const (
		latchCount     = 2
		goroutineCount = 4
	)

	var (
		goroutineLog = log.New(os.Stdout, "[goroutine] ", 0)
		waiterLog    = log.New(os.Stdout, "[waiter   ] ", 0)
	)

	var (
		wg sync.WaitGroup
	)

	// make latch
	l := latch.NewCountDownLatch(latchCount)

	// start goroutines
	wg.Add(goroutineCount)
	for i := 0; i < goroutineCount; i++ {
		i := i
		go func() {
			defer func() { wg.Done() }()

			time.Sleep(time.Duration(1+i) * 100 * time.Millisecond)
			goroutineLog.Printf("done [%d]", i)

			l.CountDown()
		}()
	}

	// wait until latch is open
	select {
	case <-l.Await():
		waiterLog.Print("latch opened")
	case <-time.After(goroutineCount * time.Second):
		waiterLog.Print("time over")
	}

	// wait until all goroutine is done
	wg.Wait()

}
Output:

[goroutine] done [0]
[goroutine] done [1]
[waiter   ] latch opened
[goroutine] done [2]
[goroutine] done [3]

func NewCountDownLatch

func NewCountDownLatch(count int) *CountDownLatch

NewCountDownLatch は、指定したカウント数を使用して *CountDownLatch を生成します。

func (*CountDownLatch) Await

func (c *CountDownLatch) Await() <-chan struct{}

Await は、非同期処理の完了を待機する際に利用できるチャネルを返します。 このチャネルは、ラッチがオープンした際にクローズされます。

func (*CountDownLatch) CountDown

func (c *CountDownLatch) CountDown()

CountDown は、ラッチをオープンするために必要なカウントを1減らします。

Jump to

Keyboard shortcuts

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