无限循环 – 迭代,该函数返回 true

huangapple go评论77阅读模式
英文:

Infinite loop - iteration, the function returns true

问题

你的问题是关于"doAll"函数的迭代顺序是否有序的。

根据你提供的代码,"doAll"函数中的迭代顺序是无序的。每次迭代都会创建一个新的goroutine来执行"doOne"函数,并且没有明确的同步机制来确保它们按照特定的顺序执行。

如果你希望迭代按照特定的顺序执行,你可以考虑使用等待组(WaitGroup)来同步goroutine的执行。你可以在每次迭代开始前调用"Add"方法增加等待组的计数,然后在"doOne"函数执行完成后调用"Done"方法减少计数。最后,你可以使用"Wait"方法来等待所有goroutine执行完成。

以下是修改后的代码示例:

import "sync"

var wg sync.WaitGroup

func doAll() {
   rows, err := MySQL.QueryRow("SELECT * FROM `settings`")
   checkError(err)
   defer rows.Close()
   for rows.Next() {
      c := make(chan bool)

      var http string

      err = rows.Scan(&http)
      checkError(err)

      wg.Add(1)
      go doOne(http)
   }
   wg.Wait()
}

func doOne() {
   defer wg.Done()
   // 执行一些代码
}

通过使用等待组,你可以确保"doAll"函数中的迭代按照顺序执行,并且在所有goroutine执行完成后才继续执行后续代码。

英文:

I've question. I need to make a program running in the background. The program is to collect and save data in my database.

I started to do so:

func main() {
   for {
      doAll()
   }
}

And that retrieves data from all addresses at one time ("go" function):

func doAll() {
   rows, err := MySQL.QueryRow("SELECT * FROM `settings`")
   checkError(err)
   defer rows.Close()
   for rows.Next() {
      c := make(chan bool)

      var http string

      err = rows.Scan(&http )
      checkError(err)

      go doOne(http)
      <- c
   }
}

And that retrieves data from one web site.

func doOne() {
   // some code
   c <- true
}

My question is whether iterations of the "doAll" function will be in order?

答案1

得分: 0

是的,doAll的迭代将按顺序进行,因为c通道是无缓冲的。这意味着在你的for rows.Next()循环中,从c读取的操作将等待doOne向通道写入数据。

你可以通过移除通道并同步执行doOne(即:将其作为函数调用)来简化这段代码。以这种方式重构的代码具有完全相同的语义。

英文:

Yes the iterations of doAll will be in order, because the c channel is unbuffered. That means in your for rows.Next() loop, the read from c will wait until doOne writes to the channel.

You can make this code simpler by removing the channel and executing doOne synchronously (that is: just call it as a function). The code refactored in this way has exactly the same semantics.

huangapple
  • 本文由 发表于 2014年10月13日 14:54:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/26334428.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定