账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Go 如何给某个协程加锁(不允许开新的协程)
    41
    0

    问题描述

    1.可能我的题目描述的不太清除,这里详细描述一下

    项目是用 beego 开发的,其中在控制器中又一个方法

    //同步图片
    func (this *ApiController) SyncImages() {
    .
    .
    .
    go models.TestSyncImages(images)
    .
    .
    .
    }
    

    在另外一个 models包里面有上述协程调用的方法

    func TestSyncImages(list []SyncImage) {
        var image = auxpi.Image{}
        var wg sync.WaitGroup
        for _, value := range list {
            go func(url string, id uint) {
                wg.Add(1)
                defer wg.Done()
                res, _ := http.Get(url)
                lUrl, name, del := localStoreInfo(res.Header.Get("Content-Type"), url)
                dst, _ := os.Create(name)
                io.Copy(dst, res.Body)
                image.ID = id
                image.Url = lUrl
                image.Delete = del
                AddSyncImage(image)
                
            }(value.External, value.ImageID)
        }
        wg.Wait()
    
    }

    工作流程是:

    用户提交同步图片的命令->控制器接到数据 SyncImages() 方法->SyncImages() 启用协程去执行 TestSyncImages()方法

    但是现在出了一个问题,如果用户同时点击两次甚至多次,会出现重复进入TestSyncImages(),会扰乱当前所在的工作的协程,如果点击多次甚至会出现内存溢出的状况。

    请问各位,如何保证 TestSyncImages() 这个方法不会被多次执行,有什么办法给这个东西加锁,或者使用别的更好的方法解决?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 孤独万岁 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部