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

how to make Goroutine not Concurrency if Same Function

如果是同一个函数,有什么方法可以让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()
              }()
              
        }
}

尝试将锁放入函数中,这使得它们的执行顺序。但是请记住 wg.Done() 必须在函数的第一行延迟。 像这样:

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

您可以使用 locks 将对资源的访问一次限制为一个线程,如下所示

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

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

更多示例here

不确定您使用 WaitGroup 的目的。如果是为了达到你想要的顺序性,那么可以去掉。