mirror of https://github.com/prometheus/prometheus
Frederic Branczyk
6 years ago
committed by
GitHub
9 changed files with 113 additions and 14 deletions
@ -0,0 +1,14 @@
|
||||
# Binaries for programs and plugins |
||||
*.exe |
||||
*.dll |
||||
*.so |
||||
*.dylib |
||||
|
||||
# Test binary, build with `go test -c` |
||||
*.test |
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE |
||||
*.out |
||||
|
||||
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 |
||||
.glide/ |
@ -0,0 +1,12 @@
|
||||
language: go |
||||
sudo: false |
||||
go: |
||||
- 1.x |
||||
- tip |
||||
install: |
||||
- go get -v github.com/golang/lint/golint |
||||
- go build ./... |
||||
script: |
||||
- go vet ./... |
||||
- $HOME/gopath/bin/golint . |
||||
- go test -v -race ./... |
@ -0,0 +1,73 @@
|
||||
# run |
||||
|
||||
[![GoDoc](https://godoc.org/github.com/oklog/run?status.svg)](https://godoc.org/github.com/oklog/run) |
||||
[![Build Status](https://travis-ci.org/oklog/run.svg?branch=master)](https://travis-ci.org/oklog/run) |
||||
[![Go Report Card](https://goreportcard.com/badge/github.com/oklog/run)](https://goreportcard.com/report/github.com/oklog/run) |
||||
[![Apache 2 licensed](https://img.shields.io/badge/license-Apache2-blue.svg)](https://raw.githubusercontent.com/oklog/run/master/LICENSE) |
||||
|
||||
run.Group is a universal mechanism to manage goroutine lifecycles. |
||||
|
||||
Create a zero-value run.Group, and then add actors to it. Actors are defined as |
||||
a pair of functions: an **execute** function, which should run synchronously; |
||||
and an **interrupt** function, which, when invoked, should cause the execute |
||||
function to return. Finally, invoke Run, which blocks until the first actor |
||||
returns. This general-purpose API allows callers to model pretty much any |
||||
runnable task, and achieve well-defined lifecycle semantics for the group. |
||||
|
||||
run.Group was written to manage component lifecycles in func main for |
||||
[OK Log](https://github.com/oklog/oklog). |
||||
But it's useful in any circumstance where you need to orchestrate multiple |
||||
goroutines as a unit whole. |
||||
[Click here](https://www.youtube.com/watch?v=LHe1Cb_Ud_M&t=15m45s) to see a |
||||
video of a talk where run.Group is described. |
||||
|
||||
## Examples |
||||
|
||||
### context.Context |
||||
|
||||
```go |
||||
ctx, cancel := context.WithCancel(context.Background()) |
||||
g.Add(func() error { |
||||
return myProcess(ctx, ...) |
||||
}, func(error) { |
||||
cancel() |
||||
}) |
||||
``` |
||||
|
||||
### net.Listener |
||||
|
||||
```go |
||||
ln, _ := net.Listen("tcp", ":8080") |
||||
g.Add(func() error { |
||||
return http.Serve(ln, nil) |
||||
}, func(error) { |
||||
ln.Close() |
||||
}) |
||||
``` |
||||
|
||||
### io.ReadCloser |
||||
|
||||
```go |
||||
var conn io.ReadCloser = ... |
||||
g.Add(func() error { |
||||
s := bufio.NewScanner(conn) |
||||
for s.Scan() { |
||||
println(s.Text()) |
||||
} |
||||
return s.Err() |
||||
}, func(error) { |
||||
conn.Close() |
||||
}) |
||||
``` |
||||
|
||||
## Comparisons |
||||
|
||||
Package run is somewhat similar to package |
||||
[errgroup](https://godoc.org/golang.org/x/sync/errgroup), |
||||
except it doesn't require actor goroutines to understand context semantics. |
||||
|
||||
It's somewhat similar to package |
||||
[tomb.v1](https://godoc.org/gopkg.in/tomb.v1) or |
||||
[tomb.v2](https://godoc.org/gopkg.in/tomb.v2), |
||||
except it has a much smaller API surface, delegating e.g. staged shutdown of |
||||
goroutines to the caller. |
@ -1,9 +1,9 @@
|
||||
// Package group implements an actor-runner with deterministic teardown. It is
|
||||
// Package run implements an actor-runner with deterministic teardown. It is
|
||||
// somewhat similar to package errgroup, except it does not require actor
|
||||
// goroutines to understand context semantics. This makes it suitable for use
|
||||
// in more circumstances; for example, goroutines which are handling
|
||||
// connections from net.Listeners, or scanning input from a closable io.Reader.
|
||||
package group |
||||
// goroutines to understand context semantics. This makes it suitable for use in
|
||||
// more circumstances; for example, goroutines which are handling connections
|
||||
// from net.Listeners, or scanning input from a closable io.Reader.
|
||||
package run |
||||
|
||||
// Group collects actors (functions) and runs them concurrently.
|
||||
// When one actor (function) returns, all actors are interrupted.
|
Loading…
Reference in new issue