OSChina 第 59 期高手问答 —— Go 并发编程

红薯 发布于 2014/12/20 08:32
阅读 7K+
收藏 36

OSCHINA 本期高手问答(12月22日-12月26日)我们请来了 @特价萝卜(为大家解答关于 Go 并发编程的各种问题。

@特价萝卜 姓名:郝林 Gopher、高级Java软件工程师、Python程序员和Linux爱好者。目前在宜信公司的小微企业增值服务中心任软件系统架构师。曾就职于搜狐网多年,并任Java项目经理。在互联网软件的设计和开发方面拥有丰富的实战经验。微博名:特价萝卜。

郝林同时也是《Go 并发编程实战》一书的作者。

点击 www.ituring.com.cn/book/1525 了解该图书详情。

为了鼓励踊跃提问, @特价萝卜 会在问答结束后从提问者中抽取 5 名幸运会员赠予《Go 并发编程实战》一书。

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 Go 并发编程问题向 @特价萝卜 提问,请直接回帖提问。

加载中
1
亓斌哥哥
亓斌哥哥
@特价萝卜 :请问 ,golang的g o oroutine和协程有什么区别? goroutine的优点在哪?
hyper0x
hyper0x
回复 @亓斌哥哥 : 与众不同不敢说,但是目前最全面深入应该可以做到。
亓斌哥哥
亓斌哥哥
回复 @特价萝卜 : 好的, 个人比较喜欢golang,但是国内这方面的的资料确实比较少,有点的都是基础入门的,希望《Go并发编程实践》可以做到与众不同
hyper0x
hyper0x
可以说,goroutine是协程的更高级进化。他们都是在用户级别进行并发例程调度和协作的手段。然后前者比后者要复杂很多,而且也高效很多。 关于goroutine详细的解释可以阅读《Go并发编程实战》的第6章和第7章。不是我卖关子,这确实一句两句说不清楚。
0
Dead_knight
Dead_knight
@特价萝卜 :一直想抽时间学习go,可以简单说一下学习go的基本路线么?
hyper0x
hyper0x
非常欢迎!一般的路线是:学习基本语法->编写程序->学习各种开源项目->学习高级用法->编写完整系统。 当然,这个路线是递进和迭代的。
军师ives
跟学习普通的程序语言一样的啊。学完基础语法、动手做。
0
lgscofield
lgscofield
请问这本书有多厚, 请问生产环境中用go的场景
hyper0x
hyper0x
这本书有500多页,你可以感觉一下类似页数的书籍的重量。 Go语言的适用于任何高并发的应用场景。当然,前提是你对Go语言有足够的了解,并且进行了必要的评估。 现在很多大型互联网公司都是使用Go语言。他们的使用策略很多都是运维脚本->外围系统->核心系统。
0
撸红薯
撸红薯

@特价萝卜 :golang 的协程 在tcp高并发的环境中和 linux的epoll 和 windows 的iocp 的性能做过比较嘛?我在4G内存下压力测试10Wtcp长连接就会抛出panic,内存和cpu都没有到上限。。其实内存离上限还有点距离大概1G多。。。。

还有golang的内存持续占用太高,哪怕当前没有多少东西在执行 该释放的内存都应该被释放了。但是golang的进程依旧占用很高的内存。这点会不会导致如果golang和mysql在一台机子上面会出现mysql内存不足内存换页频繁导致服务器性能下滑,这点有没有相关的解决办法。

hyper0x
hyper0x
回复 @冰力 : OK。Go语言会占用更多的内容主要是它会实时调度goroutine以及监测运行时系统(运行时系统本身也是要耗费少量内存的)的运行情况。另外,goroutine的初始内存消耗也是非常小的,只有4K。可以衡量一下,稍多的内存消耗换来的是超高的并发处理量和非常低的开发成本,哪个更划算?
冰力
冰力
回复 @特价萝卜 : go语言的内存占用是偏高的,推荐C++/Dlang 等语言(如果能掌握)。iocp在异步上来说应该是性能最突出的一个,其次就是kqueue,最弱的是epoll,但是相差也不是很远。在用法方面iocp最简单,kqueue也相对很容易实现,epoll由于调整的次数比较多导致用法千奇百怪(但是基本和kqueue用法相似)。iocp和kqueue是最早推出的,epoll出来的比较晚。
hyper0x
hyper0x
windows的iocp我不太了解,说不好它与epoll的区别。 第一个问题还要看是哪个操作系统、允许进程持有文件操作符的数量,以及panic的内容来定位问题。 第二个问题就要看具体程序以及相关参数的实际值了。不能简单的做判断。
难易
难易
回复 @breakerror : http://www.docin.com/p-662278933.html
撸红薯
撸红薯
回复 @难易 : 这个当然我知道 golang的异步化同步的作发,我是说性能有什么好的对比数据没有,假设网卡不是io瓶颈
下一页
0
buglife
buglife
对于go语言,发现当前最大的障碍是获取go相关的资源,老是被墙
buglife
buglife
回复 @特价萝卜 : 嗯 多谢
hyper0x
hyper0x
国内有社区提供相关资源的下载,比如golangtc.com。
0
yankp
yankp
golang的垃圾回收机制是怎样的?怎么调优?
hyper0x
hyper0x
回复 @elvis_lim : 很多语言的GC都是这种方式,这个影响会非常小。Go语言的垃圾收集和清扫本身是并发的。如果完全与用户级的goroutine并行执行,那么会出现浮动垃圾等问题(比如Java的CMS垃圾回收器就存在这样的问题)。Go语言应该会在1.5或1.6版本提供完全并发的GC。
_Elvis
_Elvis
回复 @特价萝卜 : stop the world的垃圾回收,对于持续高并发网站,怎么承受得起?
hyper0x
hyper0x
目前Go语言的垃圾回收策略是CMS,并且在垃圾回收期间是需要“Stop the world”的。我们可以通过设定环境变量GOGC、调用函数runtime/debug.SetGCPercent等一些方式来对它的自动GC行为进行一些调整。
0
OscerSong
OscerSong
@特价萝卜 问一下go的并发有什么特别之处,把一些并发要求高的工作转型go方便么
hyper0x
hyper0x
特别之处主要就是Go语言有自己的“用户级别线程”的并发调度策略和实现。这可以大大提高应用程序的并发性能。同时,有了goroutine及go语句这样的并发编程方法,也可以有效降低并发编程的难度。 据我了解,高并发程序用Go语言编写是非常适合的。当然,具体系统的移植还需要根据实际情况来评估。
0
撸红薯
撸红薯
@红薯 啥时候抽奖呀
撸红薯
撸红薯
回复 @CrazyHarry : 哈哈 不要这么直接嘛....
buglife
buglife
你就是为抽奖来的?
0
Injection
Injection
@特价萝卜 :go 多进程调度有什么好的框架吗,毕竟单进程多线程无法处理进程挂掉,也没有守护进程,也没有重启机制.
hyper0x
hyper0x
Go语言的并发模型实际上是基于多线程的。在多进程编程方面,Go语言本身并没有特殊的解决方案,无非就是管道、信号、Socket等一些通用的方法。你可以看看标准库中的os包中的一些API,跟进程相关的东西在那里面,可能会对你有所帮助。
0
buglife
buglife
@特价萝卜 :我也想知道go语言适合于哪类项目的开发,这样学起来具有一定的目标性
hyper0x
hyper0x
Go语言开发Web以及其它基于网络(比如Socket)的应用程序非常的便捷和高效。这些会用到并发编程的应用程序开发,Go语言都是非常有优势的。不过,这会有一些技巧在里面。
返回顶部
顶部