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

[Go 语言]第一次用大量的并发逻辑写程序 有点烧脑

  •  
  •   ljbha007 · 2015-08-31 08:47:08 +08:00 · 3733 次点击
    这是一个创建于 3373 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天学习了一下 Go 语言 发现 Go 的强大之处
    最后做官网的 go tour 给的最后一道练习题时 被并发逻辑搞得很头疼 脑子有点转不过来
    以前用 Java 也经常写线程同步的东西 但是没有到“每个函数调用都用并发”的程度
    再加上递归的逻辑 顿时脑袋有点要爆炸的感觉
    还好最后还是绕出来了
    贴一个我自己的实现的代码

    根据我的经验这种问题应该是编程思想还没有转变 转变之后应该就不会那么烧脑了 各位 V 友有没有那么觉得?

    38 条回复    2015-09-18 12:55:24 +08:00
    ljbha007
        1
    ljbha007  
    OP
       2015-08-31 08:48:38 +08:00
    https://gist.github.com/CarlLee/24cb7c03f88b09b4a6c2

    主题里贴没有语法高亮 改用回复帖 gist
    Debugs
        2
    Debugs  
       2015-08-31 08:53:53 +08:00 via Android
    没用过
    starAsh
        3
    starAsh  
       2015-08-31 09:19:16 +08:00
    写的都很费劲,别提读了
    shadowind
        4
    shadowind  
       2015-08-31 09:56:15 +08:00
    使用 goroutine 和 channel 玩递归,有意思啊~
    scys
        5
    scys  
       2015-08-31 10:27:41 +08:00
    看着 Gist 一行行出来
    hanwujibaby
        6
    hanwujibaby  
       2015-08-31 10:34:05 +08:00
    用的 go 的哪个版本?
    passluo
        7
    passluo  
       2015-08-31 10:36:55 +08:00
    话说你是之前做外包坑我们的那个么 =。=

    看头像很像啊……
    yqf3139
        8
    yqf3139  
       2015-08-31 10:54:11 +08:00
    这样递归太费资源了吧, chan 做 url 的队列,起定数的 goroute 就行了
    ljbha007
        9
    ljbha007  
    OP
       2015-08-31 12:00:12 +08:00
    @passluo
    是 实在不好意思

    @yqf3139
    那就没办法记递归层数了啊 另外建个 struct 把 url 和层数一起传?
    ljbha007
        10
    ljbha007  
    OP
       2015-08-31 12:00:37 +08:00
    @hanwujibaby
    官网的教程里的 不知道版本
    ForgotFun
        11
    ForgotFun  
       2015-08-31 12:57:16 +08:00 via iPhone
    @passluo 哈哈 遇到仇人了
    yaoyao1158
        12
    yaoyao1158  
       2015-08-31 13:03:56 +08:00
    @passluo 前来围观……
    u926262
        13
    u926262  
       2015-08-31 13:38:00 +08:00
    @passluo 求细节
    yqf3139
        14
    yqf3139  
       2015-08-31 13:46:48 +08:00   ❤️ 1
    @ljbha007 可以传递自定义的结构体的,不过这样的话可能 chan 的缓冲到极限后,可能会都死在向 chan 推的动作中.极限要取大点,或者再自己弄个队列.
    0987363
        15
    0987363  
       2015-08-31 13:50:00 +08:00
    为嘛不用 chan 来传,简单省事,一端写 url ,一端大量 goroutine 池,一个 chan 太慢就多开几个,简单省事
    ljbha007
        16
    ljbha007  
    OP
       2015-08-31 13:55:45 +08:00
    @yqf3139
    其实性能上就是内存稍微会多一点 其他没什么影响啊
    ljbha007
        17
    ljbha007  
    OP
       2015-08-31 13:57:04 +08:00
    @ForgotFun
    @yaoyao1158
    @u926262

    之前一起做了个电商的网站 完成 80%左右烂尾了
    akira
        18
    akira  
       2015-08-31 14:03:01 +08:00
    @ljbha007 一般来说,完成度到 90%的时候,是完成了一半的工作量
    hxtheone
        19
    hxtheone  
       2015-08-31 14:08:13 +08:00
    @passluo 友情围观,汽水瓜子已备好~
    JungleHi
        20
    JungleHi  
       2015-08-31 14:16:49 +08:00
    我们公司之前也有个项目外包 http://v2ex.com/t/155956 V2EX 上没有合适的 老板后来叫他朋友做 然后... 现在不知道他们还是不是朋友了
    ljbha007
        21
    ljbha007  
    OP
       2015-08-31 14:27:37 +08:00
    @akira
    @hxtheone
    @JungleHi

    前台页面都写完了
    数据库表结构也弄好了
    基本的页面数据展示、过滤、排序这些都弄完了
    前端 js/css/html 也写完了
    后台简单做了一个插入商品条目的页面其他没做
    基本也就只有后台管理页面没弄完了
    后来客户那边天天催着要录数据
    还有个做 vi 的天天拿些高大上的页面叫我整站页面照着那个风格重做(但是客户自己并没有这么要求)
    后来搞得我很烦 不想做了
    但是无论怎么说答应的事情没做完 确实是我的错
    pythonee
        22
    pythonee  
       2015-08-31 15:24:35 +08:00
    什么叫
    每个函数调用都用并发
    pythonee
        23
    pythonee  
       2015-08-31 15:24:50 +08:00
    @shadowind 赐教下,没看懂
    xiaoyao9184
        24
    xiaoyao9184  
       2015-08-31 15:27:57 +08:00 via Android
    每个函数都是异步吧
    ljbha007
        25
    ljbha007  
    OP
       2015-08-31 15:27:59 +08:00
    @pythonee
    每个 Crawl 函数前面都加了 go 说明是在额外线程中执行的

    我是这样 每个 Crawl 函数都自己建一个 channel 然后每有一个需要爬的 url 就 再开个线程递归调用自己 然后把函数内部的 channel 传给子线程 然后自己就一直阻塞直到 从自线程的 channel 里传来的消息数量等于开启的子线程数量时 再退出线程
    ljbha007
        26
    ljbha007  
    OP
       2015-08-31 15:28:16 +08:00
    @xiaoyao9184 是的
    passluo
        27
    passluo  
       2015-08-31 15:35:17 +08:00
    @ForgotFun
    @yaoyao1158
    @u926262
    @hxtheone



    当时楼主还小,好像还在读大学,也是朋友介绍的,事实和楼主说的差不了太多(除了什么 XX 要改页面但是其实顾客没有要求之类的……)。

    结局是最后项目黄了,包工头自己赔了几万块钱……
    ljbha007
        28
    ljbha007  
    OP
       2015-08-31 15:40:59 +08:00
    @passluo

    吴迪自己赔钱了吗?我不知道这个事啊 我以为你们接着弄完了
    实在是对不住啊
    ljbha007
        29
    ljbha007  
    OP
       2015-08-31 15:41:38 +08:00
    @passluo
    那段时间我自己心理也有些问题 比较消沉 所以工作状态非常不好
    passluo
        30
    passluo  
       2015-08-31 15:43:24 +08:00
    工资是他垫付的,因为没做完,所以那边也没给他结账。

    不过,都过去了,小事儿。
    liboyue
        31
    liboyue  
       2015-08-31 16:13:51 +08:00 via Android
    @passluo 另开个贴讲讲嘛蛤蛤蛤
    wudikua
        32
    wudikua  
       2015-08-31 19:16:29 +08:00
    @passluo 世界真小
    Phariel
        33
    Phariel  
       2015-08-31 19:23:43 +08:00
    门口出售瓜子花生矿泉水,啤酒饮料八宝粥了啊。
    期待进入 V2EX 撕逼精华 https://github.com/greatghoul/sibi
    _(:з」∠)_
    Ouyangan
        34
    Ouyangan  
       2015-08-31 21:07:43 +08:00
    哈哈 , 你们能和气的讲话就好
    yaotian
        35
    yaotian  
       2015-09-01 12:37:29 +08:00
    @passluo 一个人退出,就把整个项目搞黄了?
    feuvan
        36
    feuvan  
       2015-09-01 15:07:18 +08:00   ❤️ 1
    翻了翻代码,又类似的 pattern
    done := make (chan bool, 1 )
    go func () {

    done <- true
    }()
    go func () {

    done <- true
    }()
    for n := 0; n < 2; n++ {
    <-done
    }
    ljbha007
        37
    ljbha007  
    OP
       2015-09-01 15:40:33 +08:00
    @yaotian 因为当时就我一个人在搞啊 他们设计都做好了
    heimirror
        38
    heimirror  
       2015-09-18 12:55:24 +08:00
    吴迪这个名字很熟悉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:34 · PVG 20:34 · LAX 04:34 · JFK 07:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.