登录
首页 >  Golang >  Go问答

Go 例程的循环执行不符预期

来源:stackoverflow

时间:2024-03-12 12:27:26 212浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《Go 例程的循环执行不符预期》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

**编辑得更加简洁明了

我对 go 相当陌生,对 goroutines 也完全陌生,但我需要为我正在构建的程序添加一定程度的并发性。

我想要做的是让 go func 同时运行,从技术上讲,它们是并发运行的。然而,他们也没有按照我的预期运行。

顶部 go func 应每五秒运行一次,以查找新作业和运行该作业的开放设备。如果有新作业,它会检查打开的设备。假设有三个新作业和两个打开的设备,则 for _, device := range 循环应运行两次,将每个作业分配给一个设备。五秒钟后,循环将再次运行,并查看还有一项作业需要运行,并检查这些设备是否已打开以运行该作业。 同时我希望 subssh 函数能够被连续调用。

实际发生的情况是设备循环每五秒只运行一次,因此它只使用第一个设备并运行代码,然后等待五秒并对第二个作业执行相同的操作,然后是第三个作业,切勿使用第二个设备或运行该循环两次。

go func() {
    for {
        duration := 5 * time.Second
        for x := range time.Tick(duration) {//this loop runs every five seconds
            newJobs := checkForNew(jobcoll)
            if len(newJobs) != 0 {
                openPool := checkPoolDeviceStatus(poolcoll)
                for _, device := range openDevices {
                    //for each open device this loop should run once

                }
            }
        }
    }
}()

go func() {
    subSSH(subChannel, jobcoll, poolcoll)
}()

我尝试添加等待组并添加新的等待数量的新作业,但这导致设备循环根本无法执行。

我认为我在这里遗漏了一些明显的东西,非常感谢任何帮助! 谢谢!


解决方案


您的股票行情走在正确的路径上,但变量的作用域错误。您还有一个嵌套的 for 循环,因此请继续删除它。

你会想要这样的东西:

go func() {
    ticker := time.newticker(5 * time.second) // setup outside the loop.
    for t := range ticker.c { // every time 5 seconds passes, this channel will fire.
        newjobs := checkfornew(jobcoll)
        if len(newjobs) != 0 {
            openpool := checkpooldevicestatus(poolcoll)
            for _, device := range opendevices {
                // the thing should occur.
            }
        }
    }
}()

这应该可以解决问题。请参阅:https://play.golang.org/p/zj6jdoduCcp

如果你想要一个连续执行的 goroutine,你就需要一个连续的循环。

// only executes once and quits.
go func() { doTheThing() }()

// executes continuously after each execution exit.
go func() { for { doTheThing() } }()

// "background" function
go func() { doTheThingThatNeverExits() }()

goroutine 被设计为后台进程(过于简单化)。 goroutine 只是一个易于使用的包装器,用于在调用函数时轻松并发。

编辑:错过了最后一点。

今天关于《Go 例程的循环执行不符预期》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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