在可以用协程的情况下是不是多线程已经完全没有意义了

2024-06-20 20:53:28 +08:00
 shinonome

协程更加的灵活,同时相比于多线程,开销也更小了,

感觉 python 在有锁的情况下感觉除非不支持协程,不然没有必要多线程了

11146 次点击
所在节点    Python
70 条回复
fanhed
2024-06-21 01:23:35 +08:00
CPU 密集就线程, io 密集就协程, 这两者各有擅长, 一起配合才是王道
mayli
2024-06-21 03:12:19 +08:00
应该只有超高并发有携程的需求,io 密集到一定程度,携程也没啥优势。
感觉只有高并发是硬需求
NXzCH8fP20468ML5
2024-06-21 03:21:29 +08:00
上面说什么线程适合 cpu 密集型,协程适合 io 密集型,基本上都在胡说八道。

协程的本质是一种在允许在应用态自定义的任务调度策略/方式/单元。
线程本质则是系统自带的任务调度策略/方式/单元,对应用是透明无感的。

只是某些场景只用线程的话,导致线程过多,线程切换导致大量无意义的性能开销,为了避免线程的频繁切换,因此搞出了协程。

协程是要以线程作为载体的!!!你起一百万个协程,底层还是要起几十个线程去执行这些协程,只不过这些协程的切换完全可以由应用自定义协程的调度策略(一般由运行时或编译器来做这件事情)。

常见协程的误区:

协程也可以是抢占式的,比如 go 的协程调度就是抢占式的。

cpu 密集型应用一样能适用于协程。
比如说 dataframe OLAP 引擎,就是用 tokio 的协程做任务调度。没做什么调整就得到了很高的性能。
其他 OLTP 引擎,一般都是 Cpp 或者 Java ,没有完善的协程机制,导致不得不实现 pipeline 模型的做自定义算子调度,复杂度大大提高。
moudy
2024-06-21 05:00:56 +08:00
windows 95 相对于 windows 3.2 的升级就是从携程变成了线程,亲
netabare
2024-06-21 05:05:52 +08:00
没有线程哪来的协程?

或者 op 想说的是手写线程池动不动开个新线程那种做法?
anjingdexiaocai
2024-06-21 08:02:30 +08:00
虽然刚接触协程,看这个帖子,感觉 v 站上菜鸟还真挺多的,协程是语言层面上可控的一种轻量级线程,本来就是基于多线程,怎么会用不到…
leonshaw
2024-06-21 08:11:54 +08:00
线程之于协程就像 CPU 逻辑核之于线程。想一下在有线程的情况下 SMP 是不是没有意义了。有 GIL 另说。
echo1937
2024-06-21 08:22:19 +08:00
如果是 Java 的 Project loom 这种有栈协程,无脑协程其实也没啥,就是会有一些问题;

1、cpu密集型的任务并不会快
2、执行的任务中不能有被pin住的操作,比如第三方库里很常见的 synchronized 锁和 native frame
skuuhui
2024-06-21 08:36:43 +08:00
目前开来,在 python 目前现状中,协程确实是最好的选择了,因为有解释锁+上下文切换,线程在 python 中似乎怎么也无法上得了台面。
shinonome
2024-06-21 08:42:26 +08:00
@netabare #25 emmm 嗯,是这样想的
Austaras
2024-06-21 08:51:41 +08:00
非要咬文嚼字的话协程从定义上来讲就是不能抢占的,go 那个也不叫协程啊它叫 go 程 goroutine
hefish
2024-06-21 08:53:16 +08:00
python 支持多线程了? 哪个版本开始的?
k9982874
2024-06-21 08:53:59 +08:00
协程理解成线程语法糖就行了,底层由语言决定使用什么策略分片,不需要想太多。
当然考八股就当我没说
R4rvZ6agNVWr56V0
2024-06-21 09:05:20 +08:00
细品:在一个应用中,可使用多线程来处理 CPU 密集型任务,同时使用协程来处理 IO 密集型任务。
NoobPhper
2024-06-21 09:15:46 +08:00
又来个小子
shinonome
2024-06-21 09:56:28 +08:00
@GeekGao #34 但是这在 python 中也是吗,python 中多线程也处理不了 CPU 密集的呀
shinonome
2024-06-21 09:56:44 +08:00
@NoobPhper #35 这不是来虚心请教大家嘛
shinonome
2024-06-21 09:58:31 +08:00
TVT 这是 python 分区啊,你们说的其他语言我也不懂啊,python 多线程有锁啊
R4rvZ6agNVWr56V0
2024-06-21 10:17:22 +08:00
@shinonome
不是处理不了,是 CPython 目前多线程效率低,但是其他 NoGIL 的 Python 实现一样可以哇,例如 IronPython 。
而且,可以把 CPython 线程模块换成多 multiprocess 就好了嘛。
leegoo
2024-06-21 10:25:26 +08:00
python 应该也有线程池的把。
我想楼主 是不是想表达
以前做一些耗时任务的时,都是把任务丢到线程池里面去
那么现在有协程的话,是不是可以省略创建线程池,把任务放到线程池里面动作,也可以减少线程池的维护工作

并不是纠结协程是怎么来的

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

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

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

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

© 2021 V2EX