Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- // "crypto/md5"
- "fmt"
- "sync"
- "sync/atomic"
- "time"
- // "hash/crc32"
- // "strconv"
- // "sync/atomic"
- // "time"
- )
- type job func(in, out chan interface{})
- // сюда писать код
- func ExecutePipeline(jobs ...job) {
- shared := make(chan interface{}, 2)
- wg := &sync.WaitGroup{}
- for _, work := range jobs {
- inChan := shared
- outChan := make(chan interface{}, 2)
- wg.Add(1)
- go func() {
- defer wg.Done()
- work(inChan, outChan)
- close(outChan)
- fmt.Println("Done")
- }()
- shared = outChan
- }
- // wg.Wait()
- // jobWrapper := func(work job, in, out chan interface{}, waiter *sync.WaitGroup) {
- // defer waiter.Done()
- // work(in, out)
- // }
- // wg := &sync.WaitGroup{}
- // for _, work := range jobs {
- // wg.Add(1)
- // // go jobWrapper(param, inGoro, outGoro, wg)
- // // go func() {
- // // defer wg.Done()
- // // work(inGoro, outGoro)
- // // }()
- // go work(inGoro, outGoro)
- // inGoro = outGoro
- // outGoro = make(chan interface{}, 2)
- // }
- // wg.Wait()
- }
- func MultiHash(in, out chan interface{}) {
- fmt.Println("in MultiHash")
- }
- func CombineResults(in, out chan interface{}) {
- fmt.Println("in CombineResults")
- }
- func SingleHash(in, out chan interface{}) {
- //var read string
- //read = (<-in).(string)
- // _read := read.(string)
- fmt.Println("in SingleHash read :")
- //var ou string = read + "_Out_"
- //out <- ou
- }
- // type job func(in, out chan interface{})
- func main() {
- var ok = true
- var recieved uint32
- freeFlowJobs := []job{
- job(func(in, out chan interface{}) {
- out <- 1
- time.Sleep(10 * time.Millisecond)
- currRecieved := atomic.LoadUint32(&recieved)
- // в чем тут суть
- // если вы накапливаете значения,
- // то пока вся функция не отрабоатет - дальше они не пойдут
- // тут я проверяю, что счетчик увеличился в следующей функции
- // это значит что туда дошло значение прежде чем текущая
- // функция отработала
- if currRecieved == 0 {
- ok = false
- }
- }),
- job(func(in, out chan interface{}) {
- for _ = range in {
- atomic.AddUint32(&recieved, 1)
- }
- }),
- }
- ExecutePipeline(freeFlowJobs...)
- time.Sleep(2)
- if !ok || recieved == 0 {
- fmt.Println("no value free flow - dont collect them")
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement