• Stars
    star
    1,607
  • Rank 29,111 (Top 0.6 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 13 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Flow-based and dataflow programming library for Go (golang)

GoFlow - Dataflow and Flow-based programming library for Go (golang)

Build Status codecov

Status of this branch (WIP)

Warning: you are currently on v1 branch of GoFlow. v1 is a revisit and refactoring of the original GoFlow code which remained almost unchanged for 7 years. This branch is deep in progress, no stability guaranteed. API also may change.

If your code depends on the old implementation, you can build it using release 0.1.

--

GoFlow is a lean and opinionated implementation of Flow-based programming in Go that aims at designing applications as graphs of components which react to data that flows through the graph.

The main properties of the proposed model are:

  • Concurrent - graph nodes run in parallel.
  • Structural - applications are described as components, their ports and connections between them.
  • Reactive/active - system's behavior is how components react to events or how they handle their lifecycle.
  • Asynchronous/synchronous - there is no determined order in which events happen, unless you demand for such order.
  • Isolated - sharing is done by communication, state is not shared.

Getting started

If you don't have the Go compiler installed, read the official Go install guide.

Use go tool to install the package in your packages tree:

go get github.com/trustmaster/goflow

Then you can use it in import section of your Go programs:

import "github.com/trustmaster/goflow"

Basic Example

Below there is a listing of a simple program running a network of two processes.

Greeter example diagram

This first one generates greetings for given names, the second one prints them on screen. It demonstrates how components and graphs are defined and how they are embedded into the main program.

package main

import (
	"fmt"
	"github.com/trustmaster/goflow"
)

// Greeter sends greetings
type Greeter struct {
	Name           <-chan string // input port
	Res            chan<- string // output port
}

// Process incoming data
func (c *Greeter) Process() {
	// Keep reading incoming packets
	for name := range c.Name {
		greeting := fmt.Sprintf("Hello, %s!", name)
		// Send the greeting to the output port
		c.Res <- greeting
	}
}

// Printer prints its input on screen
type Printer struct {
	Line <-chan string // inport
}

// Process prints a line when it gets it
func (c *Printer) Process() {
	for line := range c.Line {
		fmt.Println(line)
	}
}

// NewGreetingApp defines the app graph
func NewGreetingApp() *goflow.Graph {
	n := goflow.NewGraph()
	// Add processes to the network
	n.Add("greeter", new(Greeter))
	n.Add("printer", new(Printer))
	// Connect them with a channel
	n.Connect("greeter", "Res", "printer", "Line")
	// Our net has 1 inport mapped to greeter.Name
	n.MapInPort("In", "greeter", "Name")
	return n
}

func main() {
	// Create the network
	net := NewGreetingApp()
	// We need a channel to talk to it
	in := make(chan string)
	net.SetInPort("In", in)
	// Run the net
	wait := goflow.Run(net)
	// Now we can send some names and see what happens
	in <- "John"
	in <- "Boris"
	in <- "Hanna"
	// Send end of input
	close(in)
	// Wait until the net has completed its job
	<-wait
}

Looks a bit heavy for such a simple task but FBP is aimed at a bit more complex things than just printing on screen. So in more complex an realistic examples the infractructure pays the price.

You probably have one question left even after reading the comments in code: why do we need to wait for the finish signal? This is because flow-based world is asynchronous and while you expect things to happen in the same sequence as they are in main(), during runtime they don't necessarily follow the same order and the application might terminate before the network has done its job. To avoid this confusion we listen for a signal on network's wait channel which is sent when the network finishes its job.

Terminology

Here are some Flow-based programming terms used in GoFlow:

  • Component - the basic element that processes data. Its structure consists of input and output ports and state fields. Its behavior is the set of event handlers. In OOP terms Component is a Class.
  • Connection - a link between 2 ports in the graph. In Go it is a channel of specific type.
  • Graph - components and connections between them, forming a higher level entity. Graphs may represent composite components or entire applications. In OOP terms Graph is a Class.
  • Network - is a Graph instance running in memory. In OOP terms a Network is an object of Graph class.
  • Port - is a property of a Component or Graph through which it communicates with the outer world. There are input ports (Inports) and output ports (Outports). For GoFlow components it is a channel field.
  • Process - is a Component instance running in memory. In OOP terms a Process is an object of Component class.

More terms can be found in Flow-based Wiki Terms and FBP wiki.

Documentation

Contents

  1. Components
    1. Ports and Events
    2. Process
    3. State
  2. Graphs
    1. Structure definition
    2. Behavior

Package docs

Documentation for the flow package can be accessed using standard godoc tool, e.g.

godoc github.com/trustmaster/goflow

Links

Here are related projects and resources:

TODO

  • Integration with NoFlo-UI/Flowhub (in progress)
  • Distributed networks via TCP/IP and UDP
  • Reflection and monitoring of networks

More Repositories

1

gkeep2notion

Export contents from Google Keep and import it into Notion
Python
87
star
2

trac2github

Converts Trac milestones, tickets and comments into Github issues 2.0 using github api v3
PHP
49
star
3

go-aspell

GNU Aspell spell checking library bindings for Go (golang)
Go
47
star
4

gochat

A simple chat written in Go using goflow library
Go
23
star
5

SugarAsterisk

Asterisk integration module for SugarCRM
PHP
18
star
6

embook

Management patterns and situational techniques for Engineering Managers
17
star
7

laravel3-hybridauth

HybridAuth bundle for Laravel 3 framework
PHP
7
star
8

pyflyde

Python runtime for Flyde - visual flow-based programming language and IDE
Python
7
star
9

noflo-tester

Tester wraps a NoFlo component/graph and provides a testing interface
CoffeeScript
4
star
10

photopasta

A tool for photo journaling and storytelling your own way
Python
3
star
11

sublime-fbp

FBP DSL syntax for SublimeText
2
star
12

cot-kickstart

HTML KickStart theme for Cotonti Siena
CSS
2
star
13

paper

Journalling app with a paper feel
JavaScript
2
star
14

imgsplit

A command line tool to split lossless Audio CD images into individual FLAC tracks
Python
2
star
15

sublime-cotonti

Cotonti CMF snippets for SublimeText 2 and SublimeText 3
Python
2
star
16

cot-view

File viewer module for Cotonti
PHP
1
star
17

cot-catdesc

A plugin to turn Cotonti Genoa categories into pages
PHP
1
star
18

cot-thanks

A simple Cotonti plugin to let users thank each other
PHP
1
star
19

cot-catindex

Generates index of categories on Cotonti-powered site's home page
PHP
1
star
20

cot-an_sitemap

Cotonti AN Sitemap plugin port for Siena
PHP
1
star
21

npmdiff

NPM package list diff tool
CoffeeScript
1
star
22

cot-pagetextbyid

Cotonti plugin which fetches page text by page ID with a TPL tag
PHP
1
star
23

noflo-api-updater

A tool to update legacy NoFlo code with the latest APIs
CoffeeScript
1
star
24

cot-qaptcha

Question-based CAPTCHA for Cotonti
PHP
1
star
25

cot-attach2

New generation attachments, downloads and galleries for Cotonti
JavaScript
1
star
26

trustmaster.github.io

Personal homepage
HTML
1
star
27

cot-watermark

Watermarks for images in Cotonti, doesn't require mod_rewrite.
PHP
1
star
28

cot-modlist

Moderators list management plugin for Cotonti
PHP
1
star