Awesome Go

semaphore

CategoryGoroutines
SubcategoryGoroutines
Stars0

Semaphore pattern implementation with timeout of lock/unlock operations based on channel and context

About semaphore

🚦 semaphore

Semaphore pattern implementation with timeout of lock/unlock operations.

Build Quality Documentation Coverage Awesome

💡 Idea

The semaphore provides API to control access to a shared resource by multiple goroutines or limit throughput.

releaser, err := semaphore.Acquire(breaker.BreakByTimeout(time.Second))
if err != nil {
	// timeout exceeded
}
defer releaser.Release()

Full description of the idea is available here.

🏆 Motivation

...

🤼‍♂️ How to

Quick start

limiter := semaphore.New(1000)

http.HandleFunc("/", func(rw http.ResponseWriter, req *http.Request) {
	if _, err := limiter.Acquire(
		breaker.BreakByContext(
			context.WithTimeout(req.Context(), time.Second),
		),
	); err != nil {
		http.Error(rw, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
		return
	}
	defer limiter.Release()

	// handle request
})

log.Fatal(http.ListenAndServe(":80", http.DefaultServeMux))

🧩 Integration

The library uses SemVer for versioning, and it is not BC-safe through major releases. You can use go modules or dep to manage its version.

The master is a feature frozen branch for versions 4.3.x and no longer maintained.

$ dep ensure -add github.com/kamilsk/[email protected]

The v4 branch is a continuation of the master branch for versions v4.4.x to better integration with go modules.

$ go get -u github.com/kamilsk/semaphore/[email protected]

The v5 branch is an actual development branch.

$ go get -u github.com/kamilsk/semaphore    # inside GOPATH and for old Go versions

$ go get -u github.com/kamilsk/semaphore/v5 # inside Go module, works well since Go 1.11

$ dep ensure -add github.com/kamilsk/[email protected]

Version v5 focused on integration with the 🚧 breaker package.

🤲 Outcomes

Console tool for command execution in parallel

This example shows how to execute many console commands in parallel.

$ semaphore create 2
$ semaphore add -- docker build
$ semaphore add -- vagrant up
$ semaphore add -- ansible-playbook
$ semaphore wait --timeout=1m --notify

asciicast

See more details here.


made with ❤️ for everyone

Frequently Asked Questions

What is semaphore?

semaphore is a Goroutines library for the Go programming language. Semaphore pattern implementation with timeout of lock/unlock operations based on channel and context

How do I install semaphore?

Install semaphore with the Go module system using `go get kamilsk/semaphore`. Check the repository for the current installation instructions.

What category does semaphore belong to?

semaphore is listed under Goroutines, specifically Goroutines.

← Back to Goroutines