gin并发的小坑及解决

最近遇到了一个问题,背景是这样的。设备端会发送一张图片到服务器上,然后服务器分析这张图片并且上传到七牛云上,然后再保存成一个事件,结果发现总会有一个设备的图片被串到别的设备的事件当中。

本以为这是七牛云的bug,因为我的文件的后缀都是一串时间戳.jpg,只有前面的url会不一样,猜测是因为七牛云只对后面多少位长度的字符串做截取处理,所以造成了存储别的字符串。

后来发现是这个原因,gin的处理函数通常是用一个*gin.Context类型的参数,上传图片我开了个新的goroutine去做,会把这个指针直接传给goroutine,因为我接受设备的事件是个异步操作,所以这个context在gin调度的时候会认为已经用完,分配新的请求的内容到这个地址,于是上传时用的指针指向的内容是另外一个值,造成了上传图片错误,在并发数量大的情况下会发生这样的事情。所以修改为了按值传递参数,在goroutine执行时,会生成一个副本,就不会串了。

goroutine有2点需要注意的。

  1. 传递指针时,需要保证,这个指针不会被别的代码所改变
  2. goroutine可以用的内存不多,如果选择按值传递参数的话,需要保证那块内容的内存足够的小,这样才能发挥goroutine的优势。

这篇东西觉得有必要写下来,缺失了一些信息,但写给自己看。

Leave a Reply

Your email address will not be published. Required fields are marked *