代码之家  ›  专栏  ›  技术社区  ›  nvh

无限期运行Go例程(完成后重新启动)

go
  •  0
  • nvh  · 技术社区  · 2 年前

    我正在将TypeScript项目重写到Golang,遇到了一个问题:

    我正在运行一个for循环,它在程序加载时启动异步worker。如果我理解正确,Go例程是一种并发运行异步代码的方法。我想做的是在函数完成后无限期地重新启动它。

    在TypeScript中,它看起来像

    async function init() {
      const count = async Users.getCount();
    
      // run all workers concurrently
      for (let i = 0; i < count; i += PER_WORKER) {
        const id = i / PER_WORKER;
        worker(id);
      }
    }
    
    async worker(id: number) {
      await new Promise((resolve) => {
        // do stuff
        resolve();
      })
    
      // restart function
      worker(workerId);
    }
    

    在Go中,我有非常相似的东西,但当重新调用内部函数时,它只是一团糟?我曾想过按时间间隔运行该函数,但我无法提前知道所需的时间。。。

    非常感谢。 NVH公司

    1 回复  |  直到 2 年前
        1
  •  3
  •   blackgreen VonC    2 年前

    我想做的是在函数完成后无限期地重新启动它。

    当然,你需要一个永恒的循环:

    for {
        f()
    }
    

    如果你想剥离永久循环本身,把它放在一个函数中,用 go :

    go func() {
        for {
            f()
        }
    }()
    

    也就是说,我们剥离 for 回路本身;这个 对于 循环每次调用我们的函数一次。执行此操作:

    for {
        go f()
    }
    

    是错误的,因为它会脱落 f() 无限次,尽可能快,无需等待 f() 返回。