首页  >  文章  >  后端开发  >  在For循环中调度作业时如何避免闭包分配问题?

在For循环中调度作业时如何避免闭包分配问题?

Linda Hamilton
Linda Hamilton原创
2024-11-17 18:09:01534浏览

How to Avoid Closure Assignment Problems When Scheduling Jobs in a For Loop?

解决“无法在 for 循环中将变量分配给匿名函数”中的闭包赋值问题

在构建任务调度程序的上下文中,无法在 for 循环中将变量分配给匿名函数可能会导致意外行为。当匿名函数捕获在其范围之外定义的变量时,会出现此问题,从而导致意外或不正确的结果。

在提到的特定场景中,正在基于包含作业名称和间隔的配置文件创建调度程序。每个作业都使用“cron”库进行调度,这需要指定一个 cron 表达式和要执行的函数。但是,代码错误地迭代作业并将相同的匿名函数分配给每个调度程序,从而导致打印错误的作业描述。

要解决此问题,我们需要确保每个匿名函数捕获其预期变量。这可以通过为循环的每次迭代创建一个新变量来实现,如下所示:

for _, job := range config.Jobs {
    realJob := job // a new variable each time through the loop
    c.AddFunc("@every "+realJob.Interval, func() {
        DistributeJob(realJob)
    })
    log.Println("Job " + realJob.Name + " has been scheduled!")
}

通过为每次迭代使用新变量,我们确保每个匿名函数捕获正确的作业对象,消除了它们都引用相同变量并导致意外结果的问题。这种方法提供了准确的作业描述并确保调度程序的预期行为。

以上是在For循环中调度作业时如何避免闭包分配问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn