syncutil

package
v2.0.0-alpha.19 Latest Latest
Warning

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

Go to latest
Published: Dec 6, 2025 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

Package syncutil Package buffer provides an implementation of an unbounded buffer.

Index

Constants

View Source
const Name = "sync-util"

Variables

This section is empty.

Functions

func CallWithContext

func CallWithContext(ctx context.Context, fn func() error) error

Types

type Pool

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

Pool is a pool of goroutines used to execute tasks concurrently.

Tasks are submitted with Go(). Once all your tasks have been submitted, you must call Wait() to clean up any spawned goroutines and propagate any panics.

Goroutines are started lazily, so creating a new pool is cheap. There will never be more goroutines spawned than there are tasks submitted.

The configuration methods (With*) will panic if they are used after calling Go() for the first time.

Pool is efficient, but not zero cost. It should not be used for very short tasks. Startup and teardown come with an overhead of around 1µs, and each task has an overhead of around 300ns.

func NewPool

func NewPool() *Pool

NewPool creates a new Pool.

func (*Pool) Go

func (p *Pool) Go(f func())

Go submits a task to be run in the pool. If all goroutines in the pool are busy, a call to Go() will block until the task can be started.

func (*Pool) MaxGoroutines

func (p *Pool) MaxGoroutines() int

MaxGoroutines returns the maximum size of the pool.

func (*Pool) Wait

func (p *Pool) Wait() error

Wait cleans up spawned goroutines, propagating any panics that were raised by a tasks.

func (*Pool) WithMaxGoroutines

func (p *Pool) WithMaxGoroutines(n int) *Pool

WithMaxGoroutines limits the number of goroutines in a pool. Defaults to unlimited. Panics if n < 1.

type SpinLock

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

func (*SpinLock) Lock

func (sl *SpinLock) Lock()

func (*SpinLock) TryLock

func (sl *SpinLock) TryLock() bool

func (*SpinLock) Unlock

func (sl *SpinLock) Unlock()

type Unbounded

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

Unbounded is an implementation of an unbounded buffer which does not use extra goroutines. This is typically used for passing updates from one entity to another within gRPC.

All methods on this type are thread-safe and don't block on anything except the underlying mutex used for synchronization.

Unbounded supports values of any type to be stored in it by using a channel of `interface{}`. This means that a call to Put() incurs an extra memory allocation, and also that users need a type assertion while reading. For performance critical code paths, using Unbounded is strongly discouraged and defining a new type specific implementation of this buffer is preferred. See internal/transport/transport.go for an example of this.

func NewUnbounded

func NewUnbounded() *Unbounded

NewUnbounded returns a new instance of Unbounded.

func (*Unbounded) Get

func (b *Unbounded) Get() <-chan any

Get returns a read channel on which values added to the buffer, via Put(), are sent on.

Upon reading a value from this channel, users are expected to call Load() to send the next buffered value onto the channel if there is any.

func (*Unbounded) Load

func (b *Unbounded) Load()

Load sends the earliest buffered data, if any, onto the read channel returned by Get(). Users are expected to call this every time they read a value from the read channel.

func (*Unbounded) Put

func (b *Unbounded) Put(t any)

Put adds t to the unbounded buffer.

type WaitGroup

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

func (*WaitGroup) Go

func (t *WaitGroup) Go(fn func())

func (*WaitGroup) Wait

func (t *WaitGroup) Wait() error

Jump to

Keyboard shortcuts

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