挠秃头了求大神解救 - V2EX
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 4076 次点击
    这是一个创建于 2375 天前的主题,其中的信息可能已经有所发展或是发生改变。

    菜鸟写了个递归复制文件夹文件的程序 到了关键一步出了点小问题 图 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     Solana     2963 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:25 PVG 18:25 LAX 02:25 JFK 05:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86