Friday, February 5, 2021

GoLang - Concurrency - channels for queueing

 package main


import (
    "fmt"
    "os"
    "time"
)

func add(a, b float64float64 {
    return a + b
}

func pause(sec int) {
    for i := 0; i <= sec; i++ {
        fmt.Println(" tic tic ", i)
        time.Sleep(time.Second / 4)
    }
}

func onetoten() {
    for i := 1; i <= 10; i++ {
        fmt.Print(" ", i)
        time.Sleep(time.Second / 4)
    }
}

func backg(msg chan string) {
    for {
        // wait for order from main func
        fmt.Println("print from inside backg goroutine: ", <-msg)
        // got the message now do something
        onetoten()
        pause(5)
    }
    //fmt.Println("The End!")
}

func main() {
    //fmt.Println(add(2, 3))
    //go pause(5)
    var mystring string
    mychannel := make(chan string5)
    defer close(mychannel)
    mychannel <- "Initial value for channel"
    go backg(mychannel)

    for {
        fmt.Println("\r\n Enter Text:")
        fmt.Scanln(&mystring)
        fmt.Printf("%s", mystring)
        mychannel <- mystring
        if mystring == "q" {
            os.Exit(0)
        }
    }

}

GoLang - process multiple files concurrently

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strconv"
    "strings"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func analyze(msg string) {
    var total float64
    var min float64
    var max float64
    var numlines float64
    total = 0
    numlines = 0
    max = 0
    min = 1000000000
    dat2 := make([]string200)
    // read the file
    daterr := ioutil.ReadFile(msg)
    check(err)
    dat2 = strings.Split(string(dat), "\r\n")
    // iterate through the text file
    for i := 0; i < len(dat2); i++ {
        //fmt.Println("inside for loop", i)
        if figerr := strconv.ParseFloat(dat2[i], 64); err == nil {
            //total + new value
            total = total + fig
            numlines = numlines + 1
            if min > fig {
                min = fig
            }
            if max < fig {
                max = fig
            }

            //fmt.Println(fig)
        } else {
            // print error if not parsed
            fmt.Println(err)
            break
        }
    }
    fmt.Println("Analysis of file:", msg)
    fmt.Println("Total is:", total)
    fmt.Println("Total figures:", numlines)
    fmt.Println("Average is:", total/numlines)
    fmt.Println("Max: ", max, "Min: ", min)
}

func main() {

    var mystring string
    myslice := make([]string3)

    myslice[0] = "random_numbers1.txt"
    myslice[1] = "random_numbers2.txt"
    myslice[2] = "random_numbers3.txt"

    for i := 0; i < len(myslice); i++ {
        // trigger analyze as go routine
        // no need to use channels as we dont need to Queue anything
        go analyze(myslice[i])
    }

    for {
        fmt.Println("\r\n Enter Filename:")
        fmt.Scanln(&mystring)
        fmt.Printf("%s", mystring)
        if mystring == "q" {
            os.Exit(0)
        } else {
            go analyze(mystring)
        }

    }

}

GoLang - file analyze function

 package main


import (
    "fmt"
    "io/ioutil"
    "strconv"
    "strings"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
    var total float64
    var min float64
    var max float64
    var numlines float64
    total = 0
    numlines = 0
    max = 0
    min = 1000000000
    dat2 := make([]string200)
    // read the file
    daterr := ioutil.ReadFile("random_numbers1.txt")
    check(err)
    dat2 = strings.Split(string(dat), "\r\n")
    // iterate through the text file
    for i := 0; i < len(dat2); i++ {
        //fmt.Println("inside for loop", i)
        if figerr := strconv.ParseFloat(dat2[i], 64); err == nil {
            //total + new value
            total = total + fig
            numlines = numlines + 1
            if min > fig {
                min = fig
            }
            if max < fig {
                max = fig
            }

            //fmt.Println(fig)
        } else {
            // print error if not parsed
            fmt.Println(err)
        }
    }
    fmt.Println("Total is:", total)
    fmt.Println("Total fgures:", numlines)
    fmt.Println("Average is:", total/numlines)
    fmt.Println("Max: ", max, "Min: ", min)
}