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

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

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


Golang Go语言中第一次用大量的并发逻辑写程序 有点烧脑
39 回复

https://gist.github.com/CarlLee/24cb7c03f88b09b4a6c2

主题里贴没有语法高亮 改用回复帖 gist

更多关于Golang Go语言中第一次用大量的并发逻辑写程序 有点烧脑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


写的都很费劲,别提读了

使用 goroutine 和 channel 玩递归,有意思啊~

看着 Gist 一行行出来

用的 go 的哪个版本?

话说你是之前做外包坑我们的那个么 =。=

看头像很像啊……

这样递归太费资源了吧, chan 做 url 的队列,起定数的 goroute 就行了


是 实在不好意思


那就没办法记递归层数了啊 另外建个 struct 把 url 和层数一起传?


官网的教程里的 不知道版本

哈哈 遇到仇人了

前来围观……

可以传递自定义的结构体的,不过这样的话可能 chan 的缓冲到极限后,可能会都死在向 chan 推的动作中.极限要取大点,或者再自己弄个队列.

为嘛不用 chan 来传,简单省事,一端写 url ,一端大量 goroutine 池,一个 chan 太慢就多开几个,简单省事


其实性能上就是内存稍微会多一点 其他没什么影响啊





之前一起做了个电商的网站 完成 80%左右烂尾了

一般来说,完成度到 90%的时候,是完成了一半的工作量

友情围观,汽水瓜子已备好~

我们公司之前也有个项目外包 http://v2ex.com/t/155956 V2EX 上没有合适的 老板后来叫他朋友做 然后… 现在不知道他们还是不是朋友了





前台页面都写完了
数据库表结构也弄好了
基本的页面数据展示、过滤、排序这些都弄完了
前端 js/css/html 也写完了
后台简单做了一个插入商品条目的页面其他没做
基本也就只有后台管理页面没弄完了
后来客户那边天天催着要录数据
还有个做 vi 的天天拿些高大上的页面叫我整站页面照着那个风格重做(但是客户自己并没有这么要求)
后来搞得我很烦 不想做了
但是无论怎么说答应的事情没做完 确实是我的错

什么叫
每个函数调用都用并发

赐教下,没看懂

每个函数都是异步吧


每个 Crawl 函数前面都加了 go 说明是在额外线程中执行的

我是这样 每个 Crawl 函数都自己建一个 channel 然后每有一个需要爬的 url 就 再开个线程递归调用自己 然后把函数内部的 channel 传给子线程 然后自己就一直阻塞直到 从自线程的 channel 里传来的消息数量等于开启的子线程数量时 再退出线程








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

结局是最后项目黄了,包工头自己赔了几万块钱……



吴迪自己赔钱了吗?我不知道这个事啊 我以为你们接着弄完了
实在是对不住啊


那段时间我自己心理也有些问题 比较消沉 所以工作状态非常不好

工资是他垫付的,因为没做完,所以那边也没给他结账。

不过,都过去了,小事儿。

另开个贴讲讲嘛蛤蛤蛤

门口出售瓜子花生矿泉水,啤酒饮料八宝粥了啊。
期待进入 V2EX 撕逼精华 https://github.com/greatghoul/sibi
(:з」∠)

哈哈 , 你们能和气的讲话就好

一个人退出,就把整个项目搞黄了?

翻了翻代码,又类似的 pattern
done := make (chan bool, 1 )
go func () {

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

done <- true
}()
for n := 0; n < 2; n++ {
<-done
}

因为当时就我一个人在搞啊 他们设计都做好了

吴迪这个名字很熟悉

您好!

理解您在使用Go语言进行大量并发编程时遇到的挑战。Go语言以其强大的并发处理能力著称,特别是通过goroutines和channels实现的轻量级线程和同步机制,确实需要一些时间来适应和掌握。

首先,要确保您对Go语言的并发模型有充分的理解。Goroutines是Go语言中的轻量级线程,可以非常方便地创建和管理。而channels则是用于在不同的goroutines之间进行通信和同步的关键机制。

在编写大量并发逻辑时,以下几点可能会对您有所帮助:

  1. 明确并发任务:清晰地定义每个goroutine的任务,确保它们之间的依赖关系得到妥善管理。

  2. 使用channels进行同步:通过channels来传递数据和信号,避免使用传统的锁机制,从而简化并发控制。

  3. 注意资源竞争:使用sync包中的工具(如Mutex、RWMutex等)来管理共享资源,防止数据竞争。

  4. 监控和调试:利用Go语言的pprof工具来监控程序的性能,找出并发瓶颈。同时,学会使用Go的调试器来逐步跟踪和排查并发问题。

  5. 学习社区资源:参考Go语言的官方文档和社区提供的并发编程教程、示例代码,这些资源会对您有很大帮助。

随着实践的积累,您会逐渐熟悉Go语言的并发编程模式,编写出高效、稳定的并发程序。祝您在Go语言的并发编程之路上越走越远!

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!