Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多Go例程循环未按预期执行_Go_Goroutine - Fatal编程技术网

多Go例程循环未按预期执行

多Go例程循环未按预期执行,go,goroutine,Go,Goroutine,**编辑得更简洁明了 我对GoRoutines是一个全新的人,但我需要为我正在构建的程序添加一个并发级别 我想要做的是让这两个go-func同时运行,从技术上讲,它们是。然而,他们并没有像我期望的那样运行 topgo func应每五秒钟运行一次,查找新作业和打开的设备以运行作业。如果有新的作业,它会检查打开的设备。假设有三个新作业和两个打开的设备,则将每个作业分配给一个设备时,for u,device:=range循环应运行两次。五秒钟后,循环将再次运行,并查看还有一个作业要运行,并检查这些设备

**编辑得更简洁明了

我对GoRoutines是一个全新的人,但我需要为我正在构建的程序添加一个并发级别

我想要做的是让这两个
go-func
同时运行,从技术上讲,它们是。然而,他们并没有像我期望的那样运行

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

实际上,设备循环每五秒钟只运行一次,因此它只使用第一个设备并运行代码,然后等待五秒钟并对第二个作业和第三个作业执行相同的操作,从不使用第二个设备或运行该循环两次

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)
}()
我尝试在中添加等待组,并为新作业的数量添加新的等待,但这导致设备循环根本不执行

我想我在这里遗漏了一些明显的东西,非常感谢您的帮助!
谢谢

您使用ticker的路径是正确的,但是变量在错误的范围内。您还有一个嵌套的for循环,所以继续并删除它

你会想要这样的东西:

go func(){
ticker:=time.NewTicker(5*time.Second)//在循环外设置。
对于t:=range ticker.C{//每过5秒,此通道将触发。
newJobs:=checkForNew(jobcoll)
如果len(newJobs)!=0{
openPool:=checkPoolDeviceStatus(poolcoll)
对于_,设备:=范围openDevices{
//事情应该发生。
}
}
}
}()
这应该能奏效。见:

如果您想要一个连续执行的goroutine,那么您需要一个连续循环

//只执行一次并退出。
go func(){doTheThing()}()
//在每次执行退出后连续执行。
go func(){for{doTheThing()}}()
//“背景”功能
go func(){doTheThingThatNeverExits()}()
goroutine被设计为一个后台进程(oversignition)。goroutine只是一个易于使用的包装器,用于在调用函数时方便并发


编辑:错过了最后一点。

尝试处理一个问题,这可能会导致出现问题。目前为止,你还没有提供足够完整的内容来说明到底发生了什么。谢谢@JimB-我将修改我的问题,使其更一般、更清晰。如果没有更多的代码,解决这个问题有点困难。然而,我注意到的一件事是,外部for循环是unnec。由于time.Tick()永远不会关闭,因此“ticker”循环永远不会终止。如果最里面的“设备”循环只执行一次,那么len(openDevices)必须是一个。在我看来,你可以通过代码来检查这一点。如果由于时间/并发交互而无法实现,则记录该值以尝试了解发生了什么。作为提示,如果您被并发和通道(time.Ticker使用的是
time.Ticker
),请使用Go Playder帮助自己摆脱困境。从非常简单的用例开始,比如打印,这样您就可以理解Go中的并发模式了。:)我认为“股票”循环是正常的。他的问题是为什么每个外部循环只执行一次“设备”循环。不过,关于持续执行围棋程序,你是对的。谢谢!我从这里开始,也许我做错了。我考虑运行两个goroutine,一个总是在数据库中查找更改,另一个在数据库中查找新作业。但是如果不使用并发,我不能让它们同时连续运行。你当然可以这样做,但是模式有点不同。请随时就每一个问题的具体细节提出更多问题,我相信你会得到你需要的答案。