请教一下go语言大佬 关于多线程

  • i
    iaminheu
    练手写的一个多线程 感觉学的一团糟了 自己理不清了

    实在是混乱了 WaitGroup 哪里add 哪里defer done的

    还试过channel deadlock 要不就是close channel ...

    还有一个for循环里的 goroutine 感觉总是退不出来

    直接go 以后 肯定是需要 defer done的 试过几个地方 都不对

    或者有没有遇到讲的特别好的教程 给个地址参考一下 谢谢



    package main

    import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
    "strings"
    "sync"
    //"time"
    )


    //读取当前文件夹下某个文件
    func ReadLineFile(fileName string) (urls []string) {
    res, err := ioutil.ReadFile(fileName)
    if err != nil {
    fmt.Println("read file error")
    return
    }

    var allurls = string(res)

    urls = strings.Split(allurls, "\r\n")

    return urls
    }

    func download(url string) {
    defer wg.Done()
    var num = strings.LastIndex(url, "/") //获取最后“/”的索引
    var name = url[num+1 : len(url)] //获取文件名
    res, err := http.Get(url)
    if err != nil {
    fmt.Println("get url error")
    panic(err)
    }
    file, err := os.Create(name)
    if err != nil {
    fmt.Println("create file error")
    panic(err)
    }
    body, _ := ioutil.ReadAll(res.Body)

    io.Copy(file, bytes.NewReader(body))
    fmt.Printf("下载 %s 完毕...\n", name)


    }

    func main() {
    //该txt文件内容 类似于
    //我这两个函数都测试过了 应该是没有问题 公司内部网址 外面也访问不了
    var content = ReadLineFile("./pictures.txt")

    worklist := make(chan string, 5)

    for index := 0; index < len(content); index++ {
    downLoad(url)
    }
    fmt.Print("All done")
    }
  • 首太闲
    go-common看一下。。。里面有很多例子
  • j
    jasonlyy
    最近小朋友在下棋,一看到GO就咋第一反应就是黑白子。。。
  • a
    assassin
    这问题不应该去隔壁问吗?
  • c
    cuiweiqiang
    如果你想并发
    1. channel
    复制代码
    1. select
    复制代码
    一起用
    sync.WaitGroup 定义的wg要有
    1. wg.add wg.done wg.wait
    复制代码
    这是另一套
    共同点是 都要用 go 关键字启动协程
  • i
    iaminheu
    谢谢 只不过你这样说 我就更加懵圈了 哈哈哈 初学两周
  • i
    iaminheu
    注册日期和勋章 绝对得服
  • i
    iaminheu
    大家口口声声都在说隔壁 请问 隔壁是哪?

    我隔壁我知道 都是少妇
  • i
    iaminheu
    非常感谢
  • a
    assassin
    v2ex
  • 首太闲
    b站 的代码。。
  • u
    ultraboy
    初学两周又没有其它语言编程经验的,不要搞什么并发,channel和waitgroup不要碰,能够搞清楚go关键字就不错了。
  • i
    iaminheu
    我也不愿意碰哎 有基础 但没那么深 工作需要 这个问题一直困扰

    所谓的看资料也很泛 或许应该找找所谓的官方文档
  • u
    ultraboy
    下载这种肯定例子很多的了,不要照抄,找来看懂再自己写,论坛上不可能谁给你现写个程序,或者长篇大论的跟你讲透的。
  • 独立思绪
    当你对一些方法一知半解的时候,自己写几个单例多debug下,可以加深理解了就。