1
SD10 2019-09-14 12:51:01 +08:00 via Android
是提升性能吧,同步 IO 的话 CPU 会在等着,异步在同一个线程内提高 CPU 利用率,由代码控制,thread 是用操作系统轮转来提高利用率,纯粹比 CPU 利用率效率要低,但是适合并行。所以得看你任务的 IO/ 计算 比例啊。
|
2
miniyao OP @SD10 是的,考虑相比能提升多少性能。任务对 cpu 计算消耗不大,主要是等外部 api 计算完成返回后,再在本地简单处理一下数据就可以。
|
3
alamaya 2019-09-14 13:08:47 +08:00
你这个任务频率和执行时间,单线程阻塞都搞定了,搞这些花里胡哨的好像没啥意义
|
5
cwjokaka 2019-09-14 13:29:23 +08:00
任务少的话,两者基本没差别,多的话异步优势会体现出来
|
6
littlewing 2019-09-14 13:30:37 +08:00 via iPhone
看需要多少个线程,如果太多,几千或上万,就用异步
|
7
luozic 2019-09-14 13:32:57 +08:00 via iPhone
测试环境用来 benvhmark 跑一下;不同具体业务实现 结果本来就不同
|
9
Allianzcortex 2019-09-14 13:42:20 +08:00 via iPhone
@ipwx 加个 loading 的 gif 转啊转😘
|
10
iPhoneXI 2019-09-14 13:44:37 +08:00 via Android
任务量小没区别,选代码量少容易开发维护的方式
|
11
iPhoneXI 2019-09-14 13:46:46 +08:00 via Android
@iPhoneXI 线程的话,可以用 concurrent.futures,写起来方便,也容易和 asyncio 集成
|
12
wzwwzw 2019-09-14 13:46:50 +08:00
如果项目初期没有用 asyncio 的话,还是不要选 asyncio 吧。
|
13
skinny 2019-09-14 13:59:11 +08:00
感觉 asyncio 并不好用,对我来说它有点鸡肋,使用上很复杂,效率提升也不明显,它的高级 API 拖慢了性能,低级 API 又太复杂,我感觉它的低级 API 比那种 callback 模式的更难用更难理解。
如果非常在乎性能也不会用 Python,稍微只是想改进效率的话还要异步编程有其它第三方库,如果是重头开始用 Python 写我更倾向多线程。 |
14
qiyuey 2019-09-14 14:51:39 +08:00 1
有过压测,全异步情况下 QPS 提升 30%的同时,CPU 使用率降低 15%。
|
15
artandlol 2019-09-14 14:55:04 +08:00 via Android
建议用 goroutine 性能反而高些
|
16
LokiSharp 2019-09-14 15:38:42 +08:00 via iPhone
cpu 密集换个语言开发比较合适
|
17
ClericPy 2019-09-14 17:21:37 +08:00
爬虫试过, 内存确实有节省, 不过上千并发以内不太明显, 也就几十兆
对我来说异步更大的好处是编程理念, 而不是那些不太缺的资源... 写的代码不用关心阻塞主线程 |
18
optional 2019-09-14 17:41:14 +08:00 via Android
web 服务请老老实实用队列
|
19
cabbage 2019-09-14 18:34:47 +08:00 via Android
性能不敏感的话不建议 asyncio,对开发侵入性很大,使用不方便,对非异步代码、非异步第三方库的兼容性问题也比较突出。对性能敏感的话都不建议用 Python 了,,,还是觉得 threading 比较符合 Python 的理念
|
20
hspeed18 2019-09-14 19:02:39 +08:00
两种方式都压测一下看看 qps,内存,cpu 不就一目了然了吗,不要瞎猜。
|
21
so1n 2019-09-14 22:27:15 +08:00
asynico 一般比 thread 省去了进程切换时的上下文切换
|
22
a719114136 2019-09-15 01:39:43 +08:00 via Android
1 分钟就 10 次而已,各项指标上不会有多大区别。对哪个熟悉用哪个。
对于更多的并发,只有实测才知道 |
23
watsy0007 2019-09-15 22:53:46 +08:00
基于你说的...建议熟悉的方案快速怼完. 做好异常处理.
过早的优化是万恶之源. 抛开这个, threading 和 asyncio 对 cpu 和内存的性能影响.主要基于看场景. 对于 IO 密集型的. 用 asyncio 比起 threading, 资源利用率更高效. 否则区别不大. 我建议很多 threading 里面 循环 ` await http request` 没啥区别. |