Re: [请益] 台湾golang的现况与未来

楼主: jsgolang (jsgolang)   2017-08-12 13:51:44
基本上google当初发明golang是解决了在c使用上所遇到的问题
例如 package的管理 跨平台编译 避免重复编译obj 内建多个常用的编码密码函式库
当然其他语言有的特色一定会纳入 GC的管理 常用的的资料型态(data type,ex:array)
(这些都是可以在其他语言JAVA,.NET轻易看得到)
其中让常常写多工的人觉得大幅提高效率的的两个内建功能
精简开线程(go func())
跳过OS轻松开IPC(channel)
以前这些都需要其他lib(如pthread, std, etc)帮忙
golang还实现了三个实作(个人觉得最棒的实作)
1.task scheduler
2.memory management
3.http package
1.task scheduler
内建了线程管理 大大减少了系统层面的context switch(跳过timer触发驱动)
由golang自主管理多个线程(tasks scheduling或goroutine scheduling)
更是解决了让你写程式的感觉是同步(sync) 但是底层运作是异步(async)
还有lock使用过多系统效能大幅下降的问题也解决了
因为golang的lock不会真正的的锁住线程或资源
而是把主控权交由golang内部的scheduler(不是交给kernel)做其他线程排程
所以写golang程式语言的人在没有深入了解底层运作也能写出高效能的golang程式码
这都是要归功于golang的底层异步运作机制
因为大多的程式编译人员习惯思维都是同步因此还是要满足这个思考模式
因此golang在衔接同步和异步之间的复杂工作
(node.js的底层核心也是在做同步异步的衔接工作,只是它是使用callback方式衔接,
而callback的写法对于写过driver的人是熟悉不过,这就导致就是要完整了解底层运作机制
才能写出好的driver,因此要写backend的node.js就增加了,要多花一点时间了解底层运作
写出的程式才会有比较好的表现,因此nodejs不能算完全地切开同步和异步的思维,
而后来的async/await才算是解决这问题,
但是相较于golang有lock,有go routine,有channel, nodejs task scheduling不能算是有自己真正线排程
而是像一个FIFO的task排排站 因此在这方面消耗不少内存,每一个待执行的callback都会消耗内存
当然有generator的写法可以更进一步来解决此问题,这也是node.js的最大瓶颈
TJ大神也是看到此问题从node.js跳到golang钻研)
都一一的自己实现解决
即便码农大量使用goroutine和lock都可以写出高效能程式码
可以用同步思维写程式但有异步的效能我觉得这是golang最大的特色
相较于node.js的callback,JAVA NIO亲民许多
2.memory management
实际上golang是会有效的自动allocate底层memory而且会避免呼叫太多次system call
由于使用了goroutine 因此开线程变得不在耗损太多内存 以往至少要吃
stack page, data page, code page而且都是底层系统在管理 零零总总开销很大
又会引起系统层的memory swap 又增加系统层的执行时间
(目前golang也开放码农可以微调page size调教效能)
另外当GC在free memory时候并不会真的把它还给系统(或kernel)
而是暂时的存放自己身上 当其他人需要时候它内部的内存管理可以马上提供
所以又减少了free memory system call的呼叫
这个在处理大量连线的socket时候非常很好的优化
在application layer就优化 不用在系统层缓慢的呼叫优化(因为kernel slab也有解决同样问题)
3.http package
http package就是建立在上面的机制在加上近期导入pipeline的概念
虽然goroutine已经大幅的减少内存的使用量 但是golang还是不满足
早期http package是使用暴力开go routine来解决大量连线的情况
现在引入pipeline的概念可以使得使用内存更少量效能更好 更是减少scheduler的工作
一样上层编程人员感觉不到 因为golang一样的在底层帮你完整实作并且解决又内建
JAVA还要自行导入NIO和一堆复杂的lib拼拼凑凑才能做到异步的socket处理
还要去学习异步的运作原理例如nio socket group一堆api 才能开始进行撰写高效能
在golang世界里 你完全可以不用理会这些异步如何处理 因为底层都帮你实作好了又内建
编译出的程式码就是天然的异步等级的高效能程式
这是没再去深入底层golang的实作内容 是很难体会google在这方面付出的心血结晶
※ 引述《deepkh (科科将)》之铭言:
: 若以 C 的观点来看 GO, 那么我认为 GO 自动包含了下列图书馆
: libtask - 比线程更小的线程, 但却不是线程, 所以不需要
: thread context switch 的 overhead
: libevent - non-blocking socket, buffered IO
: openssl - SSL, encrypt/decrypt, hash, 以往 C 里要用这
: 些func其实是非常蛋疼的
: cross-compiling - win32, linux, armv7, aarch64 .. 而且
: 可以在任意 host 端去 compile 成其他 target 端, 若对 C 来说
: 还必须安装 target 的 cross-compiler 然后就是不断的 GCC
: 参数调试. 只能说 C 是个磨练心志的朋友呢. 但若没有这位磨
: 练心志的朋友, 也许也很难体会 GO 改变了什么.
: go 本身没有 memory leak, 有 GC, 写法很简单, 程式语言本身
: 某种程度上像 swift 加 C. 自己感受的 GO 最大好处在于,
: 1. 很省内存, C 以往都会 alloc 一块比预期大的内存
: 当 buffer, 但 go 貌似不会把这一大块的内存的缝隙给浪费掉?!
: (没有追过 go 的 code, 纯属猜测 XD)
: 2. 效能大概比 C 慢, 在 java 上下
: https://tinyurl.com/pohmc4y
: 3. arm 里也可以跑 go, 一般要用 C 去完成 client/server
: 并且有加解密的功能时, 一个很菜的新人我认为若没人指
: 点到完成, 很难想像到底会卡了多少关卡.
: google 确实很多实验性质的 project, 像 GWT, GAE
: 但 go 的改变, 让 C coder 的良善与正直都回来了, 我认为 go
: 应该还是会继遇 go 下去吧 ~
: ※ 引述《a8319 (迪拉克)》之铭言:
: : 最近有个机会进到一家用go的小公司
: : 也愿意让我进去学
: : go光听就觉得很潮 所以满吸引我的
: : 但在台湾golang是不是几乎没有人用啊?
: : 版上好像也没有人在征 也没人讨论
: : 想请教看看各位 觉得go这个语言如何
: : 在台湾是否有前景
: : 或是更直接一点 是否有钱景
: : 希望比较有接触的大大可以分享一下
: : thx
作者: hungys (hungys)   2017-08-12 14:05:00
其实package管理部分也不是说做得多好就是 XDimport path 还会出现 github.com/.../... 感觉实在不是个良好的设计,目前dependency部分有各种第三方的解,不过官方有打算用godep统一了
作者: doublescn (Grey)   2017-08-12 14:10:00
我个人是把第三方用git submodule去拉,很少用 go get
作者: hungys (hungys)   2017-08-12 14:16:00
我之前是用glide,搭配vendor用其实还行
作者: dreamnook (亚龙)   2017-08-12 14:37:00
推不过package管理真的很扰民
作者: cs8425 (cs)   2017-08-13 10:42:00
package麻烦+1 实作上我用git submodule放特定目录底下
作者: ian90911 (xopowo)   2017-08-13 15:48:00

Links booklink

Contact Us: admin [ a t ] ucptt.com