协程怎么玩啊 我要linux下复制个文件 用CP命令 让他不卡住

hellsam · 2018-12-23 00:12:15 · 1422 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-12-23 00:12:15 的主题,其中的信息可能已经有所发展或是发生改变。

比如:
目的:用协程跑CP复制大文件 大概10~20G文件大小吧, 让他不卡住,默认用CP是卡到复制完毕才响应的,
听说协程可以让他不卡住,继续往下走的。。

import (
    "github.com/otiai10/copy"
    "fmt"

)
func main() {
    go func() {
            err := copy.Copy("/home/go.zip", "/home/test/go_end.zip")
            if err != nil {
                fmt.Println("复制失败:", err)
            } else {
                fmt.Println("复制成功")
            }
        }()
        fmt.Println("立刻显示这行,然后继续往下走,让CP不卡住后台运行的意思吧")
}

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

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

1422 次点击  
加入收藏 微博
6 回复  |  直到 2018-12-24 17:37:48
hellsam
hellsam · #1 · 6年之前
我尝试这样写,我发现执行完毕,程序10G,才复制了2G不到点就暂停了  纳闷了。

func Copy_demo() {
    err := copy.Copy("/home/go.zip", "/home/test/go_end.zip")
    if err != nil {
        fmt.Println("复制失败:", err)
    } else {
        fmt.Println("复制成功")
    }

}

func main(){
        go Copy_demo()
    time.Sleep(1 * time.Second)
    fmt.Println("执行完毕吗")
}
kekemuyu
kekemuyu · #2 · 6年之前

主程序结束,复制也就结束了。我的思路,要想复制的快就先把大文件分割,然后用多个协程并行复制,然后再合并,这样才能发挥go的威力

gl145698789
gl145698789 · #3 · 6年之前

这有个并发cp的示例, 你参考下,可以自己实现copy进度条:

https://github.com/relunctance/goutils/tree/master/exe/copyfile

_admin_
_admin_ · #4 · 6年之前

主程序退出了,协程也就结束了,如果像你这个思路写的话,主程序要等协程结束才能退出,或者用无线循环不退出,只有这样才能保证协程copy完文件。

victorl
victorl · #5 · 6年之前
kekemuyukekemuyu #2 回复

主程序结束,复制也就结束了。我的思路,要想复制的快就先把大文件分割,然后用多个协程并行复制,然后再合并,这样才能发挥go的威力

基本没有什么优势,只会导致效率越来越低,因为瓶颈在硬盘IO上。

victorl
victorl · #6 · 6年之前

加个sync.WaitGroup阻塞一下

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