Home > Software design >  how to make Goroutine not Concurrency if Same Function
how to make Goroutine not Concurrency if Same Function

Time:04-25

Is there any way to make goroutine execute one after another ( one by one) if it was the same function?

I didn't mean to use goroutine firstly. However, "os/exec" function in TCP will cause the tcp forced to stop. Thus I use goroutine to avoid crashing. But I still want them to execute by order, instead of concurrently. Here is my code.

func handleTCP(conn net.Conn) {
    defer conn.Close()
        fmt.Println("handle TCP function")
        for {
              wg := new(sync.WaitGroup)
              wg.Add(1)
              go func() {
                  cmdArgs := []string{temp_str, test_press, gh, "sample.csv"}
                  cmd := exec.Command("calib.exe", cmdArgs...)
                  wg.Done()
              }()
              
        }
}

CodePudding user response:

Try to put the lock into function, it makes theirs execution sequential. But remember about wg.Done() must be under defer at first line of the function. Something like this:

var mu sync.Mutex

func handleTCP(conn net.Conn) {
    defer conn.Close()
        fmt.Println("handle TCP function")
        for {
              wg := new(sync.WaitGroup)
              wg.Add(1)
              go func() {
                  defer wg.Done()
                  mu.Lock()
                  defer mu.UnLock()
                  cmdArgs := []string{temp_str, test_press, gh, "sample.csv"}
                  cmd := exec.Command("calib.exe", cmdArgs...)
                  
              }()
              
        }
}

CodePudding user response:

You can use locks to limit access to a resource to one thread at a time as follows

i := 1
iLock = &sync.Mutex{}

for {
    go func() {
        iLock.Lock()
        fmt.Printf("Value of i: %d\n", i)
        iLock.Unlock()
    }
}

More examples here

Not sure what you are using the WaitGroup for. If it is to achieve the sequentiality you desire, then it can be removed.

  • Related