gowl

package module
v1.0.0 Latest Latest
Warning

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

Go to latest
Published: Apr 18, 2021 License: MIT Imports: 9 Imported by: 1

README

Gowl

Build Status codecov Go Report Card FOSSA Status

Gowl is a process management and process monitoring tool at once. An infinite worker pool gives you the ability to control the pool and processes and monitor their status.

Table of Contents

Installing

Using Gowl is easy. First, use go get to install the latest version of the library. This command will install the gowl along with library and its dependencies:

go get -u github.com/hamed-yousefi/gowl

Next, include Gowl in your application:

import "github.com/hamed-yousefi/gowl"

How to use

Gowl has three main parts. Process, Pool, and Monitor. The process is the smallest part of this project. The process is the part of code that the developer must implement. To do that, Gowl provides an interface to inject outside code into the pool. The process interface is as follows:

Process interface {
Start() error
Name() string
PID() PID
}

The process interface has three methods. The Start function contains the user codes, and the pool workers use this function to run the process. The Name function returns the process name, and the monitor uses this function to provide reports. The PID function returns process id. The process id is unique in the entire pool, and it will use by the pool and monitor.

Let's take a look at an example:

Document struct {
content string
hash string
}

func (d *Document) Start() error {
hasher := sha1.New()
hasher.Write(bv)
h.hash = base64.URLEncoding.EncodeToString(hasher.Sum(nil))
}

func (d *Document) Name() string {
return "hashing-process"
}

func (d *Document) PID() PID {
return "p-1"
}

func (d *Document) Hash() string {
return h.hash
}

As you can see, in this example, Document implements the Process interface. So now we can register it into the pool.

Pool

Creating Gowl pool is very easy. You must use the NewPool(size int) function and pass the pool size to this function. Pool size indicates the worker numbers in and the underlying queue size that workers consume process from it. Look at the following example:

pool := gowl.NewPool(4)

In this example, Gowl will create a new instance of a Pool object with four workers and an underlying queue with the size of four.

Start

To start the Gowl, you must call the Start() method of the pool object. It will begin to create the workers, and workers start listening to the queue to consume process.

Register process

To register processes to the pool, you must use the Register(args ...process) method. Pass the processes to the register method, and it will create a new publisher to publish the process list to the queue. You can call multiple times when Gowl pool is running.

Kill process

One of the most remarkable features of Gowl is the ability to control the process after registered it into the pool. You can kill a process before any worker runs it. Killing a process is simple, and you need the process id to do it.

pool.Kill(PID("p-909"))
Close

Gowl is an infinite worker pool. However, you should have control over the pool and decide when you want to start it, register a new process on it, kill a process, and close the pool and terminate the workers. Gowl gives you this option to close the pool by the Close() method of the Pool object.

Monitor

Every process management tool needs a monitoring system to expose the internal stats to the outside world. Gowl gives you a monitoring API to see processes and workers stats.

You can get the Monitor instance by calling the Monitor() method of the Pool. The monitor object is as follows:

Monitor interface {
PoolStatus() pool.Status
Error(PID) error
WorkerList() []WorkerName
WorkerStatus(name WorkerName) worker.Status
ProcessStats(pid PID) ProcessStats
}

The Monitor gives you this opportunity to get the Pool status, process error, worker list, worker status, and process stats. Wis Monitor API, you can create your monitoring app with ease. The following example is using Monitor API to present the stats in the console in real-time.

process-monitoring

Also, you can use the Monitor API to show worker status in the console:

worker-monitoring

License

MIT License, please see LICENSE for details.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Monitor

type Monitor interface {
	// PoolStatus returns pool status
	PoolStatus() pool.Status
	// Error returns process's error by process id.
	Error(PID) error
	// WorkerList returns the list of worker names of the pool.
	WorkerList() []WorkerName
	// WorkerStatus returns worker status. It accepts worker name as input.
	WorkerStatus(name WorkerName) worker.Status
	// ProcessStatus returns process stats. It accepts process id as input.
	ProcessStats(pid PID) ProcessStats
}

Monitor is a mechanism for observation processes and pool stats.

type PID

type PID string

PID is a custom type of string that represents process id.

func (PID) String

func (p PID) String() string

String returns the string value of process id.

type Pool

type Pool interface {
	// Start runs the pool.
	Start() error
	// Register adds the process to the pool queue.
	Register(p ...Process)
	// Close stops a running pool.
	Close() error
	// Kill cancel a process before it starts.
	Kill(pid PID)
	// Monitor returns pool monitor.
	Monitor() Monitor
}

Pool is a mechanism to dispatch processes between a group of workers.

func NewPool

func NewPool(size int) Pool

NewPool makes a new instance of Pool. I accept an integer value as input that represents pool size.

type Process

type Process interface {
	// Start runs the process. It returns an error object if any thing wrong
	// happens in runtime.
	Start() error
	// Name returns process name.
	Name() string
	// PID returns process id.
	PID() PID
}

Process is an interface that represents a process

type ProcessStats

type ProcessStats struct {
	// WorkerName is the name of the worker that this process belongs to.
	WorkerName WorkerName

	// Process is process that this stats belongs to.
	Process Process

	// Status represents the current state of the process.
	Status process.Status

	// StartedAt represents the start date time of the process.
	StartedAt time.Time

	// FinishedAt represents the end date time of the process.
	FinishedAt time.Time
	// contains filtered or unexported fields
}

ProcessStats represents process statistics.

type WorkerName

type WorkerName string

WorkerName is a custom type of string that represents worker's name.

Directories

Path Synopsis
status

Jump to

Keyboard shortcuts

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