-
Notifications
You must be signed in to change notification settings - Fork 0
/
介绍
54 lines (41 loc) · 3.48 KB
/
介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
链接 "https://blog.csdn.net/weixin_44966641/article/details/122314638?ops_request_misc=&request_id=&biz_id
=102&utm_term=python%20%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B&utm_medium=distribute.pc_search_result.
none-task-blog-2~all~sobaiduweb~default-0-122314638.nonecase&spm=1018.2226.3001.4187"
程序提速的方法
单线程串行:未利用任何并发技巧的编程方式,CPU需要等待IO,效率较低。(不加改造的naive的程序)
多线程并发:在某个线程进行IO时,CPU可以调度另一个线程进行计算,提高了CPU利用率。实际上仍然是一个CPU核心进行分时调度。(threading)
多CPU并行:需要多核CPU,可以并行地处理多个线程,充分利用现代CPU的多核性能。(multiprocessing)
多机器并行:分布式计算,多机器并行。(hadoop/hive/spark)
Python 对并发编程的支持
多线程:threading,使得某个线程的IO操作和另一个线程的CPU计算可以同时进行,避免CPU等待IO,提高CPU利用率。
多进程:multiprocessing,利用现代CPU多核的特点,真正地并行执行任务。
异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数的异步执行。
使用Lock对临界区资源进行加锁,避免数据竞争。
使用Queue实现不同线程/进程之间的数据通信,实现生产者/消费者模式。
使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果。
使用subprocess启动外部程序的进程,并进行输入输出的交互。
怎样选择多线程多进程多协程
Python并发编程有以下三种方式:多线程 Thread,多进程 Process,多协程 Coroutine。
CPU密集型计算与IO密集型计算
CPU密集型(CPU-bound)
CPU密集型也叫做计算密集型,是指IO在很短的时间内就可以完成,CPU需要大量的计算和处理,CPU占用率相当高。
例如:压缩解压缩、加密解密、正则表达式搜索等
IO密集型(IO-bound)
IO密集型指的是程序运行的大部分状况是CPU在等待IO(磁盘、内存、网络等)的读写完成,CPU的占用率比较低。
例如:文件处理程序、网络爬虫程序、读写数据库程序等
多线程、多进程、多协程的对比
包含关系:一个进程中可以启动多个线程,一个线程中可以启动多个协程。
多进程
优点:可以利用多核CPU进行并行计算,在 CPython 中,只有多进程可以
缺点:占用资源最多,可以启动数目最少
使用场景:CPU密集型计算
多线程
优点:相比于进程更轻量级,占用资源更少
缺点:
相较于进程:受限于全局解释器锁GIL,在CPython中,多线程只能使用一个CPU,即只能并发执行,无法充分利用多核处理器。但是Python中的多线程技术也能用于IO密集型计算,这是利用CPU和IO可以同时执行的特点。
相较于协程:启动数目有限制,占用内存资源,有线程切换的开销
适用场景:IO密集型计算、同时运行的任务数目不是特别多
多协程
优点:内存开销最小,可启动数目最多(可多达几万个)
缺点:支持的库有限制(如requests库不支持,需用aiohttp)、代码实现复杂
适用于:IO密集型计算、需要启动超多任务、有现成的库支持