goroutine

package module
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Jul 29, 2021 License: MIT Imports: 3 Imported by: 0

README

goroutine

A goroutine wrapper for creating and running panic safe goroutines.

The purpose of this package is to provide a simple wrapper function for goroutines, which automatically handles panics in goroutines. Starting a new goroutine without taking care of recovering from a possible panic in that goroutine itself could crash the whole application.

The Go function runs an arbitrary function fn in a separate goroutine, which handles the recovering from panic within that goroutine.

Usage (with dot import)

Instead of running

go func(s string) {
   panic(s)
}("Hello World")

simply call

Go(func(s string) {
  panic(s)
}, "Hello World")

in order to create a panic safe goroutine.

Examples

package main

import (
	"fmt"
	. "github.com/sknr/goroutine"
	"os"
	"os/signal"
	"syscall"
	"time"
)

var errChan chan string

func init() {
	errChan = make(chan string)
	
	// Override the default recover function.
	SetDefaultRecoverFunc(func(v interface{}) {
		errChan <- fmt.Sprintf("%v", v)
	})
}

func main() {
	exitChan := make(chan struct{})

	Go(func() {
		for i := 3; i > 0; i-- {
			Go(func(a, b int) {
				fmt.Println("Divide by zero", a/b)
			}, 1, 0)
			time.Sleep(1 * time.Second)
		}
		fmt.Println("Exit goroutine")
		close(exitChan)
	})

	for {
		select {
		case err := <-errChan:
			fmt.Println("Goroutine exits with error: ", err)
		case <-exitChan:
			return
		}
	}
}
Create a new goroutine with a custom recover function

In order to override the default recover function for goroutines, simply provide an alternative implementation for with goroutine.SetDefaultRecoverFunc.

If you need different recover functions for different goroutines, you can simply call

Goroutine(func(name string) {
    fmt.Println("Hallo", name)
}).WithRecoverFunc(func(v interface{}) {
    log.Printf("Custom recover function in goroutine, with error: %v", v)
}).Go("Welt")

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Go

func Go(fn interface{}, params ...interface{})

Go runs an arbitrary function fn in a separate goroutine, which does handle the recovering from panic within that goroutine. Starting a new goroutine without taking care of recovering from a possible panic in that goroutine itself could crash the whole application. The input param fn must be a generic function, where params contains the possible parameter for that function, otherwise a panic occurs. Instead of running:

go func(s string) {
  panic(s)
}("Hello World")

Simply call:

Go(func(s string) {
  panic(s)
}, "Hello World")

func Goroutine

func Goroutine(fn interface{}) *goroutine

Goroutine creates a new panic safe goroutine, with the defaultRecoverFunc as recover function.

func SetDefaultRecoverFunc

func SetDefaultRecoverFunc(fn RecoverFunc)

SetDefaultRecoverFunc can be used to override the defaultRecoverFunc which is used by Go and Goroutine functions. Note: Calling panic() within the recover function fn, will cause the application to crash if a panic within the goroutine arise.

If you pass nil as a RecoverFunc, the panic will be silently recovered.

Types

type RecoverFunc

type RecoverFunc func(v interface{})

The RecoverFunc type defines the signature of a recover function within a goroutine.

func GetDefaultRecoverFunc

func GetDefaultRecoverFunc() RecoverFunc

GetDefaultRecoverFunc returns the current default recover function for goroutines used by the Go and Goroutine functions.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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