Go routines 和 Java 线程池的区别有哪些?

2019-11-01 08:26:39 +08:00
 lhx2008
比如使用上,原理设计上
6442 次点击
所在节点    Go 编程语言
33 条回复
yuikns
2019-11-01 08:29:32 +08:00
go routine 是官方提供的,线程加协程池
optional
2019-11-01 08:35:53 +08:00
用户态 vs 内核调度
Orenoid
2019-11-01 08:39:44 +08:00
Go 不只是线程,还包括协程,具体调度原理就不清楚了
111111111111
2019-11-01 08:41:45 +08:00
1.协程的成本开销比线程小
2.协程是用户调度,线程是交给系统调度


使用上协程应该比线程要多操点心,但 Go 自己有调度器协程使用上其实不怎么操心

其他的,可能就是省了创建线程管理线程的代码,只写一个关键字就行了
lhx2008
2019-11-01 08:45:21 +08:00
@optional
@111111111111
go 的用户态调度,是不是可以抽象理解为把阻塞代码前后进行分割,分成小的代码块,放入线程池中执行呢
scukmh
2019-11-01 08:55:36 +08:00
@lhx2008 没那么简单,但一般情况下如此。
baiyi
2019-11-01 09:05:53 +08:00
不清楚 java 的线程池,没办法比较

如果想了解 goroutine,推荐一篇文章: https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/

如果想从源码的角度来了解实现,可以看下《 Go 语言学习笔记》的源码剖析,虽然是基于 1.5 版本,但是调度器方面在以后的的版本中更新不多,所以完全没问题
mikulch
2019-11-01 09:27:52 +08:00
go 语言的包管理器现在完善的如何?
ahsjs
2019-11-01 09:44:18 +08:00
@mikulch 基本都 go mod 了。
xmge
2019-11-01 09:54:51 +08:00
go 的协成是一种轻量级的线程,一个线程通过 go 的调度动态地与多个协程绑定。
lolizeppelin
2019-11-01 10:07:07 +08:00
线程
一个线程跑满,就吃饱一个 cpu
N 个线程跑满对应 N 个 cpu,只要与 cpu 数量相同多线程就能吃饱 cpu
但是实际代码里会阻塞,一阻塞会自动让出 cpu, 所以在阻塞写法里,程序的线程超过 cpu 数量能提高性能
但是过多的线程数带来的上下文切换回拖慢整体


协程
通过寄存器保存代码片段,遇到阻塞(一般是 io,或者自定义的协程锁),会切换到其他代码片段
所有代码片段的入口存放一个不停排序的队列
一个循环(相当于一个线程)不停的排序这个队列,并弹出最前面的数据获取到代码片段并执行
一般只有一个主线程,由于代码片段的切换由程序自己决定,没有系统级上下文切换,性能好,缺点是单线程


所以性能最好的方式是结合多线程与协程,但是非语言级很难用一个库来实现支持多线程的协程

目前除了 go, dart (也就是 google 的 flutter 所用语言)也有多线程协程支持


我瞎鸡巴说的...我没写过 go 哈哈哈哈哈哈
youxiachai
2019-11-01 10:11:10 +08:00
有兴趣的其实去可以了解一下
CSP ( Communicating Sequential Process )理论
richzhu
2019-11-01 10:30:30 +08:00
@lolizeppelin 卧槽 大佬,你这段话我要加入到面试复习笔记里
ZSeptember
2019-11-01 11:00:44 +08:00
goroutine 的底层也是线程池,G 相当于一个 Runable。
goroutine 的优化是将阻塞都放在用户态,自己调度,就不会创建很多的系统线程了。

比如,将所有的 IO 操作都封装了,底层使用 epoll 之类的非阻塞接口,对外暴露同步阻塞接口,所以不会真正阻塞底层线程。
同步,锁之类的都是在用户态
CosimoZi
2019-11-01 11:35:54 +08:00
协程的本质就是 continuation
godoway
2019-11-01 12:37:17 +08:00
不如问一下,go 的协程和 kt 的协程有什么区别。
个人认为 kt 的用起来更简单
zunceng
2019-11-01 13:37:29 +08:00
大部分的 thread pool 都不用实现了 , 在一定程度上协程随便开。

Ps:一定程度上 ,我没试过开上万个 goroutine, 超过一定程度我估计也会吃不消
reus
2019-11-01 13:54:26 +08:00
语义上没有区别。
lolizeppelin
2019-11-01 14:41:24 +08:00
@richzhu

记这个不如好好把一个协程库的代码读透,比如 python 的 eventlet
读透了搞清楚模型模型了就自然理解了....啥语言都一个样,记下来真没用....
lolizeppelin
2019-11-01 14:43:07 +08:00
话说...好像这些都是从 erlang 里出来的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/615080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX