登录
首页 >  Golang >  Go问答

如何顺序运行处理函数

来源:stackoverflow

时间:2024-03-16 12:03:17 370浏览 收藏

在处理大量数据的端点处理程序中,为确保顺序执行,使用等待组的方法并不恰当。正确的做法是使用互斥锁,如 `sync.Mutex`,它可以保证一次只允许一个处理程序实例运行。通过锁定和解锁互斥锁,可以控制对处理程序的并发访问,从而确保请求的顺序执行。

问题内容

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

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
}

以上就是《如何顺序运行处理函数》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>