[Go 语言]第一次用大量的并发逻辑写程序 有点烧脑 - V2EX
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 4196 次点击
    这是一个创建于 3702 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天学习了一下 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     Solana     2226 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 16:03 PVG 00:03 LAX 09:03 JFK 12:03
    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