昨天学习了一下 Go 语言 发现 Go 的强大之处
最后做官网的 go tour 给的最后一道练习题时 被并发逻辑搞得很头疼 脑子有点转不过来
以前用 Java 也经常写线程同步的东西 但是没有到“每个函数调用都用并发”的程度
再加上递归的逻辑 顿时脑袋有点要爆炸的感觉
还好最后还是绕出来了
贴一个我自己的实现的代码
根据我的经验这种问题应该是编程思想还没有转变 转变之后应该就不会那么烧脑了 各位 V 友有没有那么觉得?
![]() | 1 ljbha007 OP |
2 Debugs 2015-08-31 08:53:53 +08:00 via Android 没用过 |
3 starAsh 2015-08-31 09:19:16 +08:00 写的都很费劲,别提读了 |
![]() | 4 shadowind 2015-08-31 09:56:15 +08:00 使用 goroutine 和 channel 玩递归,有意思啊~ |
![]() | 5 scys 2015-08-31 10:27:41 +08:00 看着 Gist 一行行出来 |
![]() | 6 hanwujibaby 2015-08-31 10:34:05 +08:00 用的 go 的哪个版本? |
![]() | 7 passluo 2015-08-31 10:36:55 +08:00 话说你是之前做外包坑我们的那个么 =。= 看头像很像啊…… |
![]() | 8 yqf3139 2015-08-31 10:54:11 +08:00 这样递归太费资源了吧, chan 做 url 的队列,起定数的 goroute 就行了 |
![]() | 9 ljbha007 OP |
![]() | 10 ljbha007 OP @hanwujibaby 官网的教程里的 不知道版本 |
![]() | 12 yaoyao1158 2015-08-31 13:03:56 +08:00 @passluo 前来围观…… |
![]() | 14 yqf3139 2015-08-31 13:46:48 +08:00 ![]() @ljbha007 可以传递自定义的结构体的,不过这样的话可能chan 的缓冲到极限后,可能会都死在向 chan 推的动作中.极限要取大点,或者再自己弄个队列. |
![]() | 15 0987363 2015-08-31 13:50:00 +08:00 为嘛不用 chan 来传,简单省事,一端写 url ,一端大量 goroutine 池,一个 chan 太慢就多开几个,简单省事 |
![]() | 17 ljbha007 OP |
![]() | 20 JungleHi 2015-08-31 14:16:49 +08:00 我们公司之前也有个项目外包 http://v2ex.com/t/155956 V2EX 上没有合适的 老板后来叫他朋友做 然后... 现在不知道他们还是不是朋友了 |
![]() | 21 ljbha007 OP |
![]() | 22 pythonee 2015-08-31 15:24:35 +08:00 什么叫 每个函数调用都用并发 |
24 xiaoyao9184 2015-08-31 15:27:57 +08:00 via Android 每个函数都是异步吧 |
![]() | 25 ljbha007 OP @pythonee 每个 Crawl 函数前面都加了 go 说明是在额外线程中执行的 我是这样 每个 Crawl 函数都自己建一个 channel 然后每有一个需要爬的 url 就 再开个线程递归调用自己 然后把函数内部的 channel 传给子线程 然后自己就一直阻塞直到 从自线程的 channel 里传来的消息数量等于开启的子线程数量时 再退出线程 |
![]() | 26 ljbha007 OP @xiaoyao9184 是的 |
![]() | 27 passluo 2015-08-31 15:35:17 +08:00 @ForgotFun @yaoyao1158 @u926262 @hxtheone 当时楼主还小,好像还在读大学,也是朋友介绍的,事实和楼主说的差不了太多(除了什么 XX 要改页面但是其实顾客没有要求之类的……)。 结局是最后项目黄了,包工头自己赔了几万块钱…… |
![]() | 30 passluo 2015-08-31 15:43:24 +08:00 工资是他垫付的,因为没做完,所以那边也没给他结账。 不过,都过去了,小事儿。 |
![]() | 33 Phariel 2015-08-31 19:23:43 +08:00 |
![]() | 34 Ouyangan 2015-08-31 21:07:43 +08:00 哈哈 , 你们能和气的讲话就好 |
36 feuvan 2015-09-01 15:07:18 +08:00 ![]() 翻了翻代码,又类似的 pattern done := make (chan bool, 1 ) go func () { 略 done <- true }() go func () { 略 done <- true }() for n := 0; n < 2; n++ { <-done } |
38 heimirror 2015-09-18 12:55:24 +08:00 吴迪这个名字很熟悉 |