go中的channel的一点疑惑

yz23je · 2022-07-16 17:18:57 · 2247 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-07-16 17:18:57 的主题,其中的信息可能已经有所发展或是发生改变。

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

var delete_channel = make(chan string,100)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2247 次点击  
加入收藏 微博
9 回复  |  直到 2022-07-20 16:34:03
focusonline
focusonline · #1 · 3年之前

这个场景为啥不用defer?

fginter
fginter · #2 · 3年之前

个人观点:这种场景,没有必要创建协程来删除旧文件,直接删除就行。

yz23je
yz23je · #3 · 3年之前
focusonlinefocusonline #1 回复

这个场景为啥不用defer?

实际场景要复杂的,所以没法使用这个,如果使用功能倒是可以实现,但不利于代码阅读和以后的维护。所以也就不使用了

yz23je
yz23je · #4 · 3年之前
fginterfginter #2 回复

个人观点:这种场景,没有必要创建协程来删除旧文件,直接删除就行。

因为删除动作对主操作没有任何影响,所以就干脆放到协程里面,让他协程那边自己处理,这样就可以不用在这上面浪费时间

liangmanlin
liangmanlin · #5 · 3年之前

这个设计是有问题的,你应该只有设计,一个住协程MG负责select 2个channel,一个是删除的任务,一个是接收空闲的channel。然后若干个worker携程Gn,负责删除文件。MG不停接收需要删除的请求,假如没有空闲的worker,则放入队列,当有空闲的worker,就从队列拿出一个,丢过去删除

xiangbuchu
xiangbuchu · #6 · 3年之前

channel那边创建有三个协程, 一个协程读channel写入slice缓存,2个协程从slice取数据删除

yz23je
yz23je · #7 · 3年之前
liangmanlinliangmanlin #5 回复

这个设计是有问题的,你应该只有设计,一个住协程MG负责select 2个channel,一个是删除的任务,一个是接收空闲的channel。然后若干个worker携程Gn,负责删除文件。MG不停接收需要删除的请求,假如没有空闲的worker,则放入队列,当有空闲的worker,就从队列拿出一个,丢过去删除

其实这个思路我们最开始也考虑过,但是后面觉得不符合我们的情况我们就没有采用了,因为如果用这个方案,后期的维护以及以后功能的升级方面会变得麻烦。

yz23je
yz23je · #8 · 3年之前
xiangbuchuxiangbuchu #6 回复

channel那边创建有三个协程, 一个协程读channel写入slice缓存,2个协程从slice取数据删除

上面的功能解决了,不过这个思路想到可以用到其它功能上。谢了

liangmanlin
liangmanlin · #9 · 3年之前
yz23jeyz23je #7 回复

#5楼 @liangmanlin 其实这个思路我们最开始也考虑过,但是后面觉得不符合我们的情况我们就没有采用了,因为如果用这个方案,后期的维护以及以后功能的升级方面会变得麻烦。

这才是最正统的方案

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传