python3.8 进程池 多进程的实现 加速程序运行

进程池

我们使用multiprocessing库下的Pool开启多进程
multiprocessing是python3内置的,不需要下载安装,直接导入即可

我们写个简单的实例,来展示到底为什么要使用多进程,以及多进程有哪些作用
让我们使用进程的第一种情况观察

什么是阻塞?

阻塞(sè):简单理解就是,计算机等待进程结束的一种状态,先看一下下面这段代码

from time import sleep  
from multiprocessing import Pool 
import os   # 引入os库的作用是为了获取子进程的ID,让我们更直观查看进程的进度


def pid():
    print(f'当前正在运行的进程是{os.getpid()}') # os.getpid()获取当前进程的ID
    sleep(1)


if __name__ == '__main__':
    pool = Pool(5) # 开启最大数量为5的进程池
    for i in range(10):
        pool.apply(pid)  # 开启阻塞

当你运行了上述代码后,执行窗口会每一停顿一秒输出一个进程编号,但是你会发现,程序在不停的跑,但是数来数去,都只有5个进程,如下所示:

python3.8 进程池 多进程的实现 加速程序运行_第1张图片

当前正在运行的进程是3386
当前正在运行的进程是3387
当前正在运行的进程是3384
当前正在运行的进程是3388
当前正在运行的进程是3385
当前正在运行的进程是3386
当前正在运行的进程是3387
...

>>>

阻塞状态:
直白的说,就像只有一个坑的公共撤硕被人占了,没有其他位置,你就得等那个人把shit拉完,你才能进去拉。而且你后面还有一群人在等着排队拉shit,这就相当于你们都是这个公共撤硕的子进程,而这个撤硕是主进程。

我们可以给pid()函数稍微修改一下代码以获取主进程的ID,代码修改如下所示:

from time import sleep
from multiprocessing import Pool
import os   


def pid():
    print(f'当前正在运行的进程是{os.getpid()},它的主进程是{os.getppid()}') 
    sleep(1)


if __name__ == '__main__':
    pool = Pool(5) # 开启最大数量为5的进程池
    for i in range(10):
        pool.apply(pid)  # 开启阻塞

输出结果为

当前正在运行的进程是3425,它的主进程是3417
当前正在运行的进程是3424,它的主进程是3417
当前正在运行的进程是3423,它的主进程是3417
当前正在运行的进程是3421,它的主进程是3417
当前正在运行的进程是3422,它的主进程是3417
当前正在运行的进程是3425,它的主进程是3417
当前正在运行的进程是3424,它的主进程是3417
...

>>>

你会发现它们的主进程都是一样的,所以说明Pool()创建的都是子进程。

非阻塞

与刚才相同的代码,这次我们把阻塞状态改为非阻塞状态,修改如下:

from time import sleep
from multiprocessing import Pool
import os   


def pid():
    print(f'当前正在运行的进程是{os.getpid()},它的主进程是{os.getppid()}') 
    sleep(1)


if __name__ == '__main__':
    pool = Pool(5)  
    for i in range(20): # 把数值加大一些,不然看不出效果
        pool.apply_async(pid)

运行上述代码后,会发现每过一秒,会一次性蹦出5个结果,刚才的,则是必须等一秒完成一个后,才能进入下一个进程,两者运作方式完全不同。
输出效果如下:

在同一个时间内,并行多个进程,非阻塞状态,可以一定程度很大提高代码的运行效率,不过通常会消耗很大计算机资源,实际使用视具体情况去定。

以上关于进程池和其他内容的描述,只为了方便大家入门理解,专业深刻详细的知识还是需要自己多去翻阅官方文档。当然,大部分的人都懒得去看,官方文档写的多,专业名词又一大堆,晦涩难懂,很容易打击初学者的学习积极性,能让大多数不是很了解进程池的初学者稍微觉得自己又懂了,才是这篇文章的初心。
python3.8 进程池 多进程的实现 加速程序运行_第2张图片

你可能感兴趣的:(python基础,多进程,多线程,python,cpu,算法)