V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Ritter
V2EX  ›  Go 编程语言

挠秃头了求大神解救

  •  
  •   Ritter · 2019-07-01 16:10:54 +08:00 · 3741 次点击
    这是一个创建于 2000 天前的主题,其中的信息可能已经有所发展或是发生改变。

    菜鸟写了个递归复制文件夹文件的程序 到了关键一步出了点小问题 图 1 图 1 主要是 CopyFile 函数 先在全局定义了一个缓冲大小为 200 的管道 但是写在 CopyFile 函数 最后的话由于 linux 系统设置文件打开的最大句柄数为 1024 会报 open too many file 错误 但是如果写在 CopyFile 函数 开头的话 整个程序又会一下就结束 无法等待运行完毕 求各位大神搭把手 99 我 8 对了 pathSlice 的长度为 2700 多

    18 条回复    2019-07-02 11:58:27 +08:00
    sunny352787
        1
    sunny352787  
       2019-07-01 16:17:36 +08:00
    你加个 channel 限制一下同时 copy 的数量啊...
    Ritter
        2
    Ritter  
    OP
       2019-07-01 16:20:52 +08:00
    @sunny352787 抱歉 小弟愚钝 不是很明白 是在 for 循环里面加吗
    sunny352787
        3
    sunny352787  
       2019-07-01 16:25:58 +08:00   ❤️ 1
    @Ritter 用了 go 关键字,就得知道锁和同步方式啊,去查查 channel 的具体用法
    在你这个设计里面,CopyChan 的定位其实错了,不应该是用它控制程序终止,而是应该用它限制 copy 文件的数量,至于如何让程序在全 copy 完再停止,可以再想想,方法很多的
    misaka19000
        4
    misaka19000  
       2019-07-01 16:26:48 +08:00   ❤️ 2
    我还以为楼主是来求脱发防治技巧的
    Ritter
        5
    Ritter  
    OP
       2019-07-01 16:31:09 +08:00
    @sunny352787 好的谢谢 之前看的都是用 channel 控制程序是否终止的 是我了解的太少了
    Ritter
        6
    Ritter  
    OP
       2019-07-01 16:31:32 +08:00
    @misaka19000 头发滞销 救救 lz 吧
    misaka19000
        7
    misaka19000  
       2019-07-01 16:45:03 +08:00   ❤️ 1
    我觉得你可以使用两个 channel,第一个 channel 用于保证当前最多有不超过 200 个 channel 在进行读写操作,另一个 channel 保证在所有的协程执行完之前主协程不会退出
    Ritter
        8
    Ritter  
    OP
       2019-07-01 16:49:21 +08:00
    @misaka19000 好的谢谢 我尝试一哈
    sunny352787
        9
    sunny352787  
       2019-07-01 16:51:57 +08:00
    @misaka19000 这个是正解,也可以用 WaitGroup,不过更麻烦,不如加个 channel 省事
    misaka19000
        10
    misaka19000  
       2019-07-01 16:52:51 +08:00   ❤️ 1
    主协程等待所有的协程结束可以使用 sync.WaitGroup 来实现
    至于多个协程之间的协作,可以使用一个容量为 200 的 channel。每个协程在进入时向 channel 写入一个值,在退出时从 channel 获取一个值,由于 channel 的容量为 200,所以最多有 200 个协程可以工作;如果容量达到上限,当前协程阻塞,等到另一个协程结束(从 channel 中取出了一个值)当前协程才可以继续执行
    Ritter
        11
    Ritter  
    OP
       2019-07-01 16:56:29 +08:00
    @sunny352787 之前也是试过 waitgroup 但是由于协程方面写的有问题也是不行
    Ritter
        12
    Ritter  
    OP
       2019-07-01 16:56:54 +08:00
    @misaka19000 跪谢大佬 我试下
    Ritter
        13
    Ritter  
    OP
       2019-07-01 17:03:38 +08:00
    @sunny352787
    @misaka19000
    搞定了 再次感谢两位大佬
    挠了半天头的问题 终于解决了
    JoJoStark
        14
    JoJoStark  
       2019-07-01 18:51:04 +08:00
    我是来看如何防脱发的,进来后你竟然给我看这个???🐶
    txy3000
        15
    txy3000  
       2019-07-01 18:54:04 +08:00 via Android
    你秃了 也变强了吗?
    sunny352787
        16
    sunny352787  
       2019-07-01 19:11:08 +08:00
    @JoJoStark 写 go 的不秃
    @misaka19000 是吧兄弟?
    Laumm
        17
    Laumm  
       2019-07-01 19:11:40 +08:00
    限制并发数量,可以用信号量,也可以使用 channel
    imiao
        18
    imiao  
       2019-07-02 11:58:27 +08:00 via Android
    只有我是进来找治秃头配方的吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.