文章截图来源来源B站:蚂蚁学python
引入并发,就是为了提升程序运行速度
1、基础介绍
1-1 CPU密集型计算、IO密集型计算
1-2 多进程、多线程、多协程对比
2、全局解释器锁GIL
2-1 python速度慢的两大原因
2-2 GIL是什么
2-3 为什么有GIL这个东西
2-4 怎样规避GIL带来的限制
3实践
3-1python创建多线程的方法
3-2实践爬虫代码(单线程和多线程)
blog_spider.py代码
muti_thread_craw.py代码
3-3生产者消费者爬虫
获取网页中标题及链接
获取网页中标题及链接的多线程代码
打印输出
4、线程安全问题以及Lock解决方案
4-1线程安全概念介绍
4-2 LOCK用于解决线程安全问题
4-3 实例代码演示问题及解决方案
执行如下:
修改方法如下:
import threading
lock = threading.Lock()
5、线程池
5-1线程池的原理
5-2使用线程池的好处
5-3ThreadPoolExecutor使用语法
5-4ThreadPoolExecutor 代码实现
as_completed方式(顺序不一定)
6 、线程池在web服务中实现加速
6-1web服务的架构及特点
6-2使用线程池加速
6-3代码用Flask实现web服务并加速
加速方案
7、多进程multiprocessing
代码对比
import math
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
PRIMES = [112272535095293] * 100
def is_prime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
sqrt_n = int(math.floor(math.sqrt(n)))
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return False
return True
def single_thread():
for number in PRIMES:
is_prime(number)
def muti_thread():
with ThreadPoolExecutor() as pool:
pool.map(is_prime, PRIMES)
def muti_process():
with ProcessPoolExecutor() as pool:
pool.map(is_prime, PRIMES)
if __name__ == "__main__":
start = time.time()
single_thread()
end = time.time()
print(f'single_thread const {end - start} s')
start = time.time()
muti_thread()
end = time.time()
print(f'muti_thread const {end - start} s')
start = time.time()
muti_process()
end = time.time()
print(f'muti_process const {end - start} s')
single_thread const 51.12013626098633 s
muti_thread const 52.01384997367859 s
muti_process const 15.291653871536255 s
8、Flask中使用多进程池加速
def is_prime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
sqrt_n = int(math.floor(math.sqrt(n)))
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return False
return True
调用方式