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

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

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

非常感谢.

推荐答案

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

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

for {
    f()
}

如果您想剥离永久循环本身,请将其放入函数中,并用go调用它:

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

也就是说,我们剥离了for循环本身;for循环每次调用我们的函数一次.执行此操作:

for {
    go f()
}

这是错误的,因为它会以尽可能快的速度无限次地旋转f()次,而不必等待f()次返回.

Go相关问答推荐

map 中的多个函数类型,Golang

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

在Golang中Mergesort的递归/并行实现中出现死锁

创建服务时云运行触发器执行失败

CURL和Postman HTTP POST工作,但Golang请求失败,状态为400

Go中的Slice[:1][0]与Slice[0]

如何使用 Go 连接到非默认 firestore 数据库?

通过 Terraform 中的 MapNestedAtribute 进行迭代

Go Template 动态获取变量

Global Thread-local Storage 在 Go 中的可行性和最佳实践

Github Actions Go lambda 项目不同的 sha256sums

Kubo,来自 IpfsNode.Bootstrap 的无效内存地址或零指针取消引用

为什么docall在singleflight中使用go panic?

在本地 go 应用程序上获取秘密的正确策略

如何将元素从一个切片移动到另一个切片

通过 golang 中的 gremlin-go 库嵌入 gremlin 服务器

从另一个没有重复的确定性 int

有没有办法在一个 goroutine 返回后延迟后取消上下文?

Go 错误:cannot use generic type without instantiation