协程真正的作用是什么

2020-09-09 14:46:03 +08:00
 PiersSoCool

这里我想出个判断题,看看大家想的是不是一致的

相对于线程来说,假设有很多请求,假设是 Golang 语言

  1. 协程处理 IO 很快
  2. 协程处理高并发很快
  3. 协程上下文开销很少
  4. 协程占用资源很少

这里面是都是正确的吗?

6251 次点击
所在节点    Go 编程语言
28 条回复
hdbzsgm
2020-09-09 14:49:55 +08:00
不加场景的话 严格说都不对 协程可以提一句 降低上下文切换频次
misaka19000
2020-09-09 14:50:00 +08:00
以前是为了充分利用 CPU 资源(在现代操作系统出现之前);
现在是为了简化异步操作,提升程序员编写代码的简洁性;
OwO233
2020-09-09 14:50:34 +08:00
https://www.zhihu.com/question/20511233
谷歌搜到了知乎的湖大,感觉很牛,尼康康。OwO
misaka19000
2020-09-09 14:50:57 +08:00
caskeep
2020-09-09 14:52:40 +08:00
@misaka19000 #2 +1 切换到 go 就是为了异步处理省事好写...
ysc3839
2020-09-09 15:05:05 +08:00
感觉网上讨论“协程”更多是指有调度器的,单线程执行的协程。我自己没有接触过,并不太了解。
我自己最早接触协程是 Python 和 JavaScript 的 async fuction 和 generator,这里的协程是一种可以中途返回,后面再恢复执行的函数,现在 C++ 20 的协程也是属于这一类。
如果讨论是后面这种协程的话,那处理 IO 快不快、上下文开销大不大,完全取决于怎么实现的,用户可以用线程池+同步 IO 。
wysnylc
2020-09-09 15:23:54 +08:00
把多线程能解决的问题搞复杂,把多线程不能解决的问题解决掉
FutherAll
2020-09-09 15:32:17 +08:00
goroutine 就是减少频繁的线程上下文切换带来的 CPU 消耗吧,以及 goroutine 占用的内存空间更小。
G-P-M 模型,真正需要切换线程是在 M 的切换,G 的切换是 go 在用户态实现的调度器来做的,更像是一种用户态线程。
lambdaq
2020-09-09 15:40:06 +08:00
真正的作用,那就是处理能力分时啊。。
noe132
2020-09-09 15:54:57 +08:00
协程是单线程异步,你不需要处理锁的问题
keepeye
2020-09-09 16:28:04 +08:00
goroutine 是多线程协程,能并行的,跟别的语言的单线程协程还是有很大不同的
PiersSoCool
2020-09-09 16:34:40 +08:00
感谢大家。

感觉协程在 JS 来说可能语法上更加方便。

我可能看了一些奇怪的文章,说协程能提升 IO 速度搞得我十分困惑。我是觉得 IO 问题是多路复用解决的。
PiersSoCool
2020-09-09 16:35:34 +08:00
我感觉 go 的协程可以解决一些问题,创建 1000 个线程任务的代价和创建 1000 个协程任务(可能只有几个线程)的代价是不一样的,上下文大部分情况应该都是相同的,上下文切换次数也是不一样的。
zhangfeiwudi
2020-09-09 16:38:03 +08:00
协程上下文开销很少
协程占用资源很少
这两对的
在这两个的前提下 ,才有“协程处理高并发很快”

因为携程切换都是在用户态进行,所以速度很快,而且每次切换保留现场的资源很少
PDX
2020-09-09 16:42:39 +08:00
我觉得解决回调地狱是最大的作用
lbp0200
2020-09-09 16:48:37 +08:00
协程处理 IO 很快

一百万 IO 任务需要处理
用线程解决,同时只能启动 1000 个
用协程解决,同时只能启动 100000 个

你猜,最后哪种解决方案先完成,先完成的解决方案,算不算快?
PiersSoCool
2020-09-09 17:17:54 +08:00
@lbp0200 我觉得在这两个处理 IO 速度是一样的,Golang 里协程也是通过线程实现的,最后都要走到系统调用上,假设采取的都是同样的 IO 技术,无论到没到达系统 IO 瓶颈,速度都是一样的,甚至说,线程还能比协程快一些。以我的了解,像这种阻塞的系统调用,并发启动 100000 个协程 = 启动 启动 100000 个线程,会爆炸的。不知道是不是对的。
linw1995
2020-09-09 19:32:23 +08:00
1. 用协程也是有用到锁的时候
2. 协程减少了上下文切换的时间
3. 用起来更方便,可以控制每个协程的状态(有的实现例外)
optional
2020-09-09 19:40:12 +08:00
减少线程的上下文切换。
JaguarJack
2020-09-09 21:26:06 +08:00
3 是重点 用户态的切换开销小

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

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

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

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

© 2021 V2EX