猿问

如果功能相同,如何使 Goroutine 不并发

如果是同一个函数,有没有办法让 goroutine 一个接一个(一个接一个)执行?


我不是故意首先使用 goroutine 的。但是TCP中的“os/exec”函数会导致tcp强制停止。因此我使用 goroutine 来避免崩溃。但我还是希望他们按顺序执行,而不是同时执行。这是我的代码。


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()

              }()

              

        }

}


繁花不似锦
浏览 85回答 2
2回答

qq_花开花谢_0

您可以使用锁将对资源的访问一次限制为一个线程,如下所示i := 1iLock = &sync.Mutex{}for {    go func() {        iLock.Lock()        fmt.Printf("Value of i: %d\n", i)        iLock.Unlock()    }}更多例子在这里不确定您使用的是什么WaitGroup。如果是为了达到你想要的顺序性,那么可以去掉。

海绵宝宝撒

尝试将锁放入函数中,这会使它们的执行顺序进行。但请记住,wg.Done() 必须在函数的第一行处于延迟状态。是这样的:var mu sync.Mutexfunc 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...)                                }()                      }}
随时随地看视频慕课网APP

相关分类

Go
我要回答