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

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

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

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

11151 次点击
所在节点    Python
70 条回复
jurassic2long
2024-06-21 10:29:28 +08:00
在 python 中,因为 gil 的存在,协程和线程在资源利用率上确实差不多。但是线程还有个巨大的优势——编程简单,协程编程,如果不是有经验的老师傅,肯定被绕晕的
foxthree
2024-06-21 10:38:37 +08:00
@GeekGao multiprocess 不就是多进程吗,python 目前的大多数应用中不还是 CPU 密集---多进程,IO 密集---多线程吗
hayala
2024-06-21 11:02:58 +08:00
@xxfye 你字多,信你的
0xD800
2024-06-21 11:29:06 +08:00
多年前我还想用易语言实现一个 fiber 调度器,要做的东西太多了,就没做了。。不过易语言有个 LING 好像做了,hook 了很多 api 。
kaminic
2024-06-21 11:37:49 +08:00
协程只是用户层轻量级的任务调度单元,背后还是需要靠线程去执行,比如 GO 的 M:N 模型,M 个协程背后 N 个线程调度执行
RockShake
2024-06-21 13:38:38 +08:00
最简单的说法你可以认为协程是咖啡店一个员工,他可以选择先做 A 咖啡,在等待搅拌的时候再去做 B 咖啡,提高自己的工作效率。多线程就是咖啡店有多个员工去准备咖啡,但是如果没有协程,那么每个员工在处理咖啡遇到等待的场景时并不会主动去接其他任务。
supergeek1
2024-06-21 13:51:06 +08:00
@xxfye python 中协程是运行在单线程上的
shawnsh
2024-06-21 13:59:03 +08:00
有啥讨论的?拿几本讲操作系统的书认真看看不行吗
wryyyyyyyyyyyy
2024-06-21 14:04:21 +08:00
@Inn0Vat10n 啊? asyncio 不就是协程么,写爬虫、后端都用啊 。后端框架 tornado ,fastapi (我目前只用这两个)都已经支持 async await 了,相关的库有 httpx aiomysql aioredis aiofiles ,可以说我 90%的代码都是协程写的。感觉只要涉及到 io 等长时间阻塞的,都可以用。
so1n
2024-06-21 14:07:47 +08:00
@mixuxin go 的也不完全是协程,混合了线程
inhzus
2024-06-21 14:10:49 +08:00
n:1 的协程和 m:n 的协程完全是两回事... 具体问题具体语言具体分析
so1n
2024-06-21 14:11:27 +08:00
不说别的语言,单拿 Python 的 Asyncio ,他仍然带有一个线程池,这个线程池可以运行一些 CPU 密集的操作,以及一些系统 API 仍是 Block 的操作:比如文件 IO 和 DNS 。(aiofiles 实际上都是在线程池操作的,只不过都转为了 async await 的形式)
changz
2024-06-21 14:14:49 +08:00
单用协程你怎么使用多核。。。
Harumi0720
2024-06-21 14:42:35 +08:00
@changz Python 目前多线程也用不了多核
yh7gdiaYW
2024-06-21 16:07:27 +08:00
@shinonome 至少 python 3.10 下有区别,去年做过对比,在我们项目的场景( CPU 密集型)下,协程比线程还是慢很多
jiaomeng
2024-06-21 18:43:25 +08:00
@xxfye 协程也有上下文切换,是因为是在用户态,所以比线程的上下文切换开销小吗
tyzandhr
2024-06-21 21:08:17 +08:00
其实协程才更接近 thread 的语义。fiber 语义也比较接近,不过不够形象。

线程的话其实翻译为 runner 比较好。
wushenlun
2024-06-21 21:36:29 +08:00
协程
A-B-C-A-B-C-A-B-C

多线程
ABC-ABC-ABC

只有 python 才觉得线程鸡肋(没错、就是我)
kenvix
2024-06-21 21:59:43 +08:00
@xxfye #23 有人到现在搞不清楚协程和非阻塞的区别,总认为协程=非阻塞,然后搞出“协程适合 io 密集型”这种申必言论。
协程+阻塞搞 io 密集型照样炸裂
yinmin
2024-06-21 22:04:41 +08:00
最优解是多进程+多协程,跑 python web 时可以用用。

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

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

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

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

© 2021 V2EX