文章目录
- 一、思维导图🧓
- 二、有了多线程为甚么还要多进程?
- 三、多进程multiprocessing知识梳理
- 四、代码实战:单线程、多线程、多进程对比CPU密集计算速度
- 五、CPU密集型计算实例
- 六、在Flask服务中使用进程池加速
一、思维导图🧓
二、有了多线程为甚么还要多进程?
三、多进程multiprocessing知识梳理
通过对比不难发现,二者的使用几乎完全一致,更易于大家开发。
四、代码实战:单线程、多线程、多进程对比CPU密集计算速度
五、CPU密集型计算实例
这里进行100次的素数判别计算,分别使用单线程
、多线程
、多进程
执行计算并输出时间。
import math
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
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 multi_thread():
with ThreadPoolExecutor() as pool:
pool.map(is_prime, PRIMES)
def multi_process():
with ProcessPoolExecutor() as pool:
pool.map(is_prime, PRIMES)
if __name__ == "__main__":
start = time.time()
single_thread()
end = time.time()
print("single_thread, cost:", end - start, "seconds")
start = time.time()
multi_thread()
end = time.time()
print("multi_thread, cost:", end - start, "seconds")
start = time.time()
multi_process()
end = time.time()
print("multi_process, cost:", end - start, "seconds")
程序执行结果如下,我们从结果中也可以知道为什么不能用多线程来解决CPU密集型的并发问题。(在执行代码后风扇开始转,呼呼呼)
single_thread, cost: 74.75585079193115 seconds
multi_thread, cost: 69.42836999893188 seconds
multi_process, cost: 25.618492603302002 seconds
六、在Flask服务中使用进程池加速
我们可以输入“1,2,3”这样的数据执行计算,通过切片得到要运算的列表,运算结果返回一个json。
import flask
from concurrent.futures import ProcessPoolExecutor
import math
import json
app = flask.Flask(__name__)
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
@app.route("/is_prime/<numbers>")
def api_is_prime(numbers):
number_list = [int(x) for x in numbers.split(",")]
results = process_pool.map(is_prime, number_list)
return json.dumps(dict(zip(number_list, results)))
if __name__ == "__main__":
process_pool = ProcessPoolExecutor()
app.run()
下一篇我们将会讲解现在比较新的协程
技术,看一看他有哪些优点,欢迎继续关注并发编程专题~