登录
首页 >  Golang >  Go问答

如何使 Goroutines 在保持相同函数的情况下不并行

来源:stackoverflow

时间:2024-03-07 11:39:26 187浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何使 Goroutines 在保持相同函数的情况下不并行》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

如果是同一个函数,有没有办法让 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()
              }()
              
        }
}

正确答案


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

i := 1
ilock = &sync.mutex{}

for {
    go func() {
        ilock.lock()
        fmt.printf("value of i: %d\n", i)
        ilock.unlock()
    }
}

更多示例here

不确定您使用 waitgroup 的目的。如果是为了达到你想要的顺序性,那么可以将其删除。

尝试将锁放入函数中,它使它们的执行顺序化。但请记住 wg.done() 必须位于函数第一行的 defer 下。 像这样的事情:

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

本篇关于《如何使 Goroutines 在保持相同函数的情况下不并行》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>