Go-Execute

module
v0.0.0-...-7dfc1e4 Latest Latest
Warning

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

Go to latest
Published: Sep 7, 2020 License: MIT

README

Build Status Go Report Card codecov GoDoc

Simple Executor for Golang to run your Jobs

This package implements "Thread-Pool" design pattern for Golang.

Its main purpose is to decouple business logic from the logic necessary for go-routines management.

Go-Execute is designed to be simple and lightweight yet flexible enough to suit your needs. It is go-routine-safe (you can enqueue Jobs from different go-routines and expect Executor to work correctly).

Example (basic enqueueing)

package main

import (
	"fmt"
	"time"

	"github.com/LasTshaMAN/Go-Execute/executor"
)

func basicBlockingEnqueueing() {
	exec := executor.New(4)

	// Will block current go-routine if Executor is busy
	exec.Enqueue(func() {
		fmt.Println("World")
	})

	fmt.Println("Hello")
	time.Sleep(time.Millisecond)
}

Example (non-blocking enqueueing)

package main

import (
	"fmt"
	"time"

	"github.com/LasTshaMAN/Go-Execute/executor"
)

func basicNonBlockingEnqueueing() {
	exec := executor.New(4)

	// Will block current go-routine if Executor is busy
	err := exec.TryEnqueue(func() {
		fmt.Println("World")
	})
	if err != nil {
		fmt.Println("Executor is full, can't enqueue more jobs at the moment ...")
		time.Sleep(1 * time.Millisecond)
	}

	fmt.Println("Hello")
	time.Sleep(time.Millisecond)
}

Example (returning value from enqueued function)

package main

import (
	"fmt"
	"math/rand"
	"time"

	"github.com/LasTshaMAN/Go-Execute/executor"
)

func gettingTheResultBack() {
	rand.Seed(time.Now().UTC().UnixNano())
	exec := executor.New(4)

	out := make(chan int)
	exec.Enqueue(func() {
		fmt.Println("Some work is done here ...")
		out <- rand.Intn(10)
	})

	result := <-out
	fmt.Printf("result = %d", result)
}

Example (waiting for all the jobs to finish)

package main

import (
	"fmt"

	"github.com/LasTshaMAN/Go-Execute/executor"
)

func enqueueAndWait() {
	exec := executor.New(4)

	for _, jobID := range []int64{1, 2, 3} {
		exec.Enqueue(func() {
			fmt.Printf("job: %d", jobID)
		})
	}
	exec.Wait()

	fmt.Println("All the jobs are done")
}

Example (more elaborate ones)

For more real-world examples check out examples directory.

Docs

https://godoc.org/github.com/LasTshaMAN/Go-Execute/executor

Installation

go get github.com/LasTshaMAN/Go-Execute/executor

Contributing

Feel free to submit issues, fork the repository and send pull requests!

Your suggestions on how to extend the functionality of Go-Execute to cover possible use-cases are also welcome!

Directories

Path Synopsis
Package executor implements "Thread-Pool" design pattern - https://en.wikipedia.org/wiki/Thread_pool.
Package executor implements "Thread-Pool" design pattern - https://en.wikipedia.org/wiki/Thread_pool.

Jump to

Keyboard shortcuts

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