Skip to content

Instantly share code, notes, and snippets.

@oleksmir
Last active September 4, 2020 14:52
Show Gist options
  • Save oleksmir/1e98226605c5e1374e29b86996df70f4 to your computer and use it in GitHub Desktop.
Save oleksmir/1e98226605c5e1374e29b86996df70f4 to your computer and use it in GitHub Desktop.
Golang Coursera
package main
import (
"fmt"
"sort"
"strconv"
"strings"
"sync"
)
// сюда писать код
var mu sync.Mutex
var SingleHash job = func(in, out chan interface{}) {
wg := sync.WaitGroup{}
for i := range in {
wg.Add(1)
go func(i interface{}) {
str := fmt.Sprintf("%v", i)
crc := make(chan string)
md := make(chan string)
crcMd := make(chan string)
go func() {
crc <- DataSignerCrc32(str)
close(crc)
}()
go func() {
mu.Lock()
md <- DataSignerMd5(str)
close(md)
mu.Unlock()
}()
go func() {
crcMd <- DataSignerCrc32(<-md)
close(crcMd)
}()
hash := <-crc + "~" + <-crcMd
out <- hash
wg.Done()
}(i)
}
wg.Wait()
}
var MultiHash job = func(in, out chan interface{}) {
wgOuter := sync.WaitGroup{}
for i := range in {
wgOuter.Add(1)
go func(i interface{}){
hash := ""
str := fmt.Sprintf("%v", i)
parts := make([]string, 6, 6)
wgInner := sync.WaitGroup{}
for j := 0; j <= 5; j++ {
wgInner.Add(1)
go func(index int) {
parts[index] = DataSignerCrc32(strconv.Itoa(index) + str)
wgInner.Done()
}(j)
}
wgInner.Wait()
hash += strings.Join(parts, "")
out <- hash
wgOuter.Done()
}(i)
}
wgOuter.Wait()
}
var CombineResults job = func(in, out chan interface{}) {
var collector []string
for i := range in {
collector = append(collector, i.(string))
}
sort.Strings(collector)
out <- strings.Join(collector, "_")
}
func ExecutePipeline(jobs ...job) {
out := make(chan interface{})
lastOut := out
if len(jobs) > 1 {
lastOut = out
for i := 1; i < len(jobs); i++ {
lastOut = next(lastOut, jobs[i])
}
}
jobs[0](nil, out)
close(out)
<-lastOut
}
func next(originIn chan interface{}, currentJob job) chan interface{} {
in := make(chan interface{})
out := make(chan interface{})
go func() {
currentJob(in, out)
close(out)
}()
go func() {
for i := range originIn {
in <- i
}
close(in)
}()
return out
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment