Skip to content

Instantly share code, notes, and snippets.

@jnovikov
Created May 12, 2019 10:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jnovikov/b318fe6ba9d4929e41f4a4e68595620f to your computer and use it in GitHub Desktop.
Save jnovikov/b318fe6ba9d4929e41f4a4e68595620f to your computer and use it in GitHub Desktop.
Example of channels
package main
import (
"fmt"
"os/exec"
"strings"
"sync"
)
var wg sync.WaitGroup
func execCode(code string) string {
cmd := exec.Command(code)
builder := strings.Builder{}
cmd.Stdout = &builder
err := cmd.Run()
if err != nil {
return err.Error()
}
return builder.String()
}
func worker(ch chan string, out chan string) {
wg.Add(1)
for cmd := range ch {
t := execCode(cmd)
out <- t
}
wg.Done()
}
func closeOutput(out chan string) {
wg.Wait()
close(out)
}
func main() {
//ch := make(chan string, 100)
//out := make(chan string, 100)
//
//go worker(ch, out)
//go worker(ch, out)
//go worker(ch, out)
//go printer(out)
//
//var s string
//var err error
//n := 0
//for _, err = fmt.Scanln(&s); err == nil; _, err = fmt.Scanln(&s) {
// fmt.Println("Readed", s)
// n += 1
// ch <- s
//}
//
//time.Sleep(2 * time.Second)
ch := make(chan string, 10)
out := make(chan string, 10)
go worker(ch, out)
go worker(ch, out)
go worker(ch, out)
var err error
var s string
for _, err = fmt.Scanln(&s); err == nil; _, err = fmt.Scanln(&s) {
ch <- s
}
close(ch)
go closeOutput(out)
for output := range out {
fmt.Println(output)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment