正在用go写后台,遇到一个场景是这样的: 每个用户在上传新文件时,go都要去删除旧文件,所以我想当用户上传新文件成功之后,就把旧文件的地址放到channel中,然后channel那边创建有三个协程来取出数据并进行删除操作。这个流程没有什么问题。我疑惑的是,我应该创建多大的channel呢,太小了我怕到时候忙不过来出现阻塞,太大了又感觉浪费。还是可以不指定channel的大小,由系统来决定,channel满了系统就自己增加,少了就自己减少,不知道会这样吗? 目前代码如下:
var delete_channel = make(chan string,100)
有疑问加站长微信联系(非本文作者)

这个场景为啥不用defer?
个人观点:这种场景,没有必要创建协程来删除旧文件,直接删除就行。
实际场景要复杂的,所以没法使用这个,如果使用功能倒是可以实现,但不利于代码阅读和以后的维护。所以也就不使用了
因为删除动作对主操作没有任何影响,所以就干脆放到协程里面,让他协程那边自己处理,这样就可以不用在这上面浪费时间
这个设计是有问题的,你应该只有设计,一个住协程MG负责select 2个channel,一个是删除的任务,一个是接收空闲的channel。然后若干个worker携程Gn,负责删除文件。MG不停接收需要删除的请求,假如没有空闲的worker,则放入队列,当有空闲的worker,就从队列拿出一个,丢过去删除
channel那边创建有三个协程, 一个协程读channel写入slice缓存,2个协程从slice取数据删除
其实这个思路我们最开始也考虑过,但是后面觉得不符合我们的情况我们就没有采用了,因为如果用这个方案,后期的维护以及以后功能的升级方面会变得麻烦。
上面的功能解决了,不过这个思路想到可以用到其它功能上。谢了
这才是最正统的方案