Go 如何按顺序运行处理程序函数

Go 如何按顺序运行处理程序函数,go,backend,Go,Backend,我有一个端点的处理函数。处理程序需要很长时间才能返回响应,包括大量处理。我不希望其他传入请求同时运行,而是等待前一个请求完成!已尝试实现waitGroups,请检查代码!每次为一个新请求创建一个新的wait组实例,它就开始并发运行,而不是等待旧的实例完成。我的等待组方法是否不正确 var wg sync.WaitGroup func Handler(c *gin.Context) { // some stuff that takes ~10-15 seconds, can't be run

我有一个端点的处理函数。处理程序需要很长时间才能返回响应,包括大量处理。我不希望其他传入请求同时运行,而是等待前一个请求完成!已尝试实现waitGroups,请检查代码!每次为一个新请求创建一个新的wait组实例,它就开始并发运行,而不是等待旧的实例完成。我的等待组方法是否不正确

var wg sync.WaitGroup

func Handler(c *gin.Context) {
  // some stuff that takes ~10-15 seconds, can't be run concurrently
  // If a second request comes put it in a queue and execute it only once this is done
    wg.Add(1)
    go func() {
        defer wg.Done()
        //some processing happens
        time.Sleep(10 * time.Second)
    }()
    wg.Wait()
    c.JSON(http.StatusOK, gin.H{"message": "Hello!"})
}
router.POST("/doSomething", Handler)

正如在评论中已经提到的,这看起来像是一个被打破的需求。但是,如果确实希望运行函数的一个实例,可以使用互斥锁:

var lock sync.Mutex
func Handler(c *gin.Context) {
    lock.Lock()
    defer lock.Unlock()
     // Process
}

首先,这听起来像是一个被打破的要求。在为一个客户端服务时,您的整个HTTP服务器不应该挂起。我不确定WaitGroup如何能够解决这个问题;如果您想在任何给定的时间做一件事,那就是互斥。WaitGroup是指等待许多事情同时完成。可能更有意义的是以下其中之一:1)如果请求已经发生,则返回429或类似错误,表示无法同时再次运行。2) 把它排成一个队列,然后立即返回201。你似乎误解了它。您的waitgroup正在等待一个进程完成,然后返回一个结果——就像您根本不使用goroutine一样。正如下面的答案中所提到的,互斥锁是此工作的合适工具。