英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论