关于多线程和协程各自适用场景问题

2019-12-05 20:27:35 +08:00
 qixiangyangrm
协程和多线程都都可以通过异步提升效率。
那么问题来了,哪些情况下应该用协程?哪些场景下用多线程?
6374 次点击
所在节点    Python
27 条回复
sylvos
2019-12-06 16:26:10 +08:00
@ClericPy 我现在用的 hug 做 api,切换到 fastapi,有必要吗,另外弱弱的问下 huey,redis,pandas,在异步函数里面用有问题吗
ClericPy
2019-12-06 16:38:41 +08:00
@sylvos #21
可以看看 Benchmarker 那个项目, hug 从 falcon 包装来的, C 加成已经飞起来了, falcon 的性能接近 golang, fastapi 基于 starlette, 后者和 golang 差距还不小, 不过 fastapi 的几个设计思想挺有意思可以借鉴, 自带 swagger, 类型面向对象的类型检查是卖点, 不过这些都可以用插件代替
后面三个东西... 看看有没有官方 asyncio 支持吧, 如果没有就丢进 executor 问题不大的, 通过多线程包出来的协程, 不是特别高并发的话开销可以忽略, 毕竟很早期(忘了是不是 aiomysql 了) 挺多轮子这么包的

轮子什么的, 之前看的时候只是记个大概, 脑子里根据需求建个索引就没继续搞了, encode 和 aiolibs 是比较有名气的协程库组织, Django 当年提了 asgi 以后 uvicorn 火了一把

我不是什么大神前辈, 就是个刷题找工作的可怜虫...
wangyzj
2019-12-06 16:47:55 +08:00
farverfull
2019-12-06 16:59:50 +08:00
基本不用多线程,cpu 密集型用多进程,io 量大异步,量小随意。项目能用就行。
aaronhua
2019-12-07 10:10:52 +08:00
@farverfull +1 基本用多线程,量小真的随意。
reus
2019-12-07 13:52:10 +08:00
@petelin goroutine 的语义和 pthread 线程并没有区别,如果说用 goroutine 就是“不碰线程”,那用 pthread 的一样是“不碰线程”。goroutine 和 pthread 都是一个抽象层,只不过一个主流实现实现成 M:N 映射,一个主流实现成 1:1 映射。pthread 实际上也有 M:N 映射的实现。
reus
2019-12-07 13:59:36 +08:00
@lewis89 错漏百出。google go 的 goroutine 实现并不是协程,现在已经有了基于信号的抢占式调度,之前也有在函数入口处的半抢占调度,不是协作式调度,自然不是协程。调度的时机,程序员是不可控制的,在纯计算的循环里也可能调度。这种性质,不是协程具备的。
“然后对于应用来讲,由于不用使用系统调用“,大错,不存在不使用系统调用的程序。
“最后用户态的协程就有一个问题,操作系统没法对你进行内存管理,传统的多线程应用程序 内存管理实际上是托管给系统”,大错,不论什么程序,操作系统都只负责内存的映射,具体怎么用是用户程序自己决定,这个和线程没有丝毫关系。

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

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

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

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

© 2021 V2EX