文章目录

  • 一、思维导图🧓
  • 二、有了多线程为甚么还要多进程?
  • 三、多进程multiprocessing知识梳理
  • 四、代码实战:单线程、多线程、多进程对比CPU密集计算速度
  • 五、CPU密集型计算实例
  • 六、在Flask服务中使用进程池加速



一、思维导图🧓

multiprocessing 导致内存不足 multiprocessing.cpu_count()_python

二、有了多线程为甚么还要多进程?

multiprocessing 导致内存不足 multiprocessing.cpu_count()_并发_02

三、多进程multiprocessing知识梳理

multiprocessing 导致内存不足 multiprocessing.cpu_count()_python_03


通过对比不难发现,二者的使用几乎完全一致,更易于大家开发。

四、代码实战:单线程、多线程、多进程对比CPU密集计算速度

multiprocessing 导致内存不足 multiprocessing.cpu_count()_多进程_04

五、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()

下一篇我们将会讲解现在比较新的协程技术,看一看他有哪些优点,欢迎继续关注并发编程专题~