为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁花不似锦 2022-12-05 16:36:02
如果是同一个函数,有没有办法让 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()              }()                      }}
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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

i := 1

iLock = &sync.Mutex{}


for {

    go func() {

        iLock.Lock()

        fmt.Printf("Value of i: %d\n", i)

        iLock.Unlock()

    }

}

更多例子在这里

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



查看完整回答
反对 回复 2022-12-05
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

尝试将锁放入函数中,这会使它们的执行顺序进行。但请记住,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...)

                  

              }()

              

        }

}


查看完整回答
反对 回复 2022-12-05
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信