如果功能相同,如何使 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
的目的。如果是为了达到你想要的顺序性,那么可以去掉。
如果是同一个函数,有什么方法可以让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
的目的。如果是为了达到你想要的顺序性,那么可以去掉。