〖Python语法进阶篇④〗 – 进程池与进程锁

万叶集
隐约雷鸣,阴霾天空。
但盼风雨来,能留你在此。


专栏系列(点击解锁) 学习路线指引 知识定位
Python全栈白皮书 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。
语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。
自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。
自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。
数据库开发实战篇 更新中
爬虫入门与实战 更新中
数据分析篇 更新中
前端入门+flask 全栈篇 更新中
django+vue全栈篇 更新中
拓展-人工智能入门 更新中
络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者
安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。
vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。
shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结]
WEB漏洞攻防篇 2021年9月3日停止更新,转战先知 区等安全 区及小密圈
渗透工具使用集锦 2021年9月3日停止更新,转战先知 区等安全 区及小密圈
点点点工程师 测试神器 – Charles 软件测试数据包抓包分析神器
测试神器 – Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得!
测试神器 – Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。
RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。
Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。
MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。


比如这个红色矩形阵列就代表一个进程池子,在这个池子中有6个进程。这6个进程会伴随进程池一起被创建,不仅如此,我们在学习面向对象的生命周期的时候曾经说过,每个实例化对象在使用完成之后都会被内存管家回收。

我们的进程也会伴随着创建与关闭的过程而被内存管家回收,每一个都是如此,创建于关闭进程的过程也会消耗一定的性能。而进程池中的进程当被创建之后就不会被关闭,可以一直被重复使用,从而避免了创建于关闭的资源消耗,也避免了创建于关闭的反复操作提高了效率。

当然,当我们执行完程序进程池关闭的时候,进程也随之关闭。

当我们有任务需要被执行的时候,会判断当前的进程池当中有没有空闲的进程(所谓空闲的进程其实就是进程池中没有执行任务的进程)。有进程处于空闲状态的情况下,任务会找到进程执行该任务。如果当前进程池中的进程都处于非空闲状态,则任务就会进入等待状态,直到进程池中有进程处于空闲状态才会进出进程池从而执行该任务。

这就是进程池的作用。

进程池的创建模块 – multiprocessing

创建进程池函数 – Pool

函数名 介绍 参数 返回值
Pool 进程池的创建 Processcount 进程池对象

进程池的常用方法

当创建了进程池对象之后,我们要对它进程操作,让我们来看一下都有哪些常用方法(函数)。

函数名 介绍 参数 返回值
apply_async 任务加入进程池(异步) func,args
close 关闭进程池
join 等待进程池任务结束
  • apply_async 函数:它的功能是将任务加入到进程池中,并且是通过异步实现的。 这个知识我们还没有学习,先不用关心它到底是什么意思。它有两个参数: , func 是加入进程池中工作的函数;args 是一个元组,代表着签一个函数的参数,这和我们创建并使用一个进程是完全一致的。
  • close 函数:当我们使用完进程池之后,通过调用 close 函数可以关闭进程池。它没有任何的参数,也没有任何的返回值。
  • join 函数:它和我们上一章节学习的 创建进程的 join 函数中方法是一致的。只有进程池中的任务全部执行完毕之后,才会执行后续的任务。不过一般它会伴随着进程池的关闭()才会使用。

apply_async 函数演示案例

接下里我们在 Pycharm 中创建一个脚本,练习一下关于进程池的使用方法。

  • 定义一个函数,打印输出该函数 每次被执行的次数 与 该次数的进程
  • 定义进程池的数量,每一次的执行进程数量最多为该进程池设定的进程数

示例代码如下:

运行结果如下:


从上面的动图我们可以看出, 函数的任务与进程池中的进程与使用 的运行结果一致。

PS:如果我们的主进程会一直执行,不会退出。那么我们并不需要添加 ,可以让进程池一直启动着,直到有任务进来就会执行。

在后面学习 WEB 开发之后,不退出主进程进行工作是家常便饭。还有一些需要长期执行的任务也不会关闭,但要是只有一次性执行的脚本,就需要添加 来保证进程池的任务全部完成之后主进程再退出。当然,如果主进程关闭了,就不会再接受新的任务了,也就代表了进程池的终结。


接下来再看一个例子,在 中加入一个 return。

这里大家可能会有一个疑问,在上一章节针对进程的知识点明明说的是 ,那么这里的 函数增加的 又有什么意义呢/p>

其实不然,在我们的使用进程池的 方法时,是通过异步的方式实现的,而异步是可以获取返回值的。针对上述脚本,我们在 中针对每一个异步 添加一个变量名,从而获取返回值。

示例代码如下:

运行结果如下:


〖Python语法进阶篇④〗 - 进程池与进程锁

从运行结果可以看出,首先 函数被线程池的线程执行了一遍,当第一组任务执行完毕紧接着执行第二次线程池任务的时候,打印输出了 的返回值,证明返回值被成功的返回了。然后继续下一组的任务…

这些都是主要依赖于 ,关于 的更多知识会在 的章节进行详细的介绍。


进程锁

进程锁的概念

锁:大家都知道,我们可以给一个大门上锁。

结合这个场景来举一个例子:比如现在有多个进程同时冲向一个 ,当前门内是没有 “人”的(其实就是进程),锁也没有锁上。当有一个进程进去之后并且把 “门” 锁上了,这时候门外的那些进程是进不来的。在门内的 “人” ,可以在 “门” 内做任何事情且不会被干扰。当它出来之后,会解开门锁。这时候又有一个 “人” 进去了门内,并且重复这样的操作,这就是 。它可以让锁后面的工作只能被一个任务来处理,只有它解锁之后下一个任务才会进入,这就是 “锁” 的概念。

而 就是仅针对于 有效的锁,当进程的任务开始之后,就会被上一把 “锁”;与之对应的是 ,它们的原理几乎是一样的。

进程锁的加锁与解锁

进程锁的使用方法:

通过 multiprocessing 导入 Manager 类

然后实例化 Manager

再然后通过实例化后的 manager 调用 它的 Lock() 函数

接下来,就需要操作这个 lock 对象的函数

函数名 介绍 参数 返回值
acquire 上锁
release 解锁(开锁)

代码示例如下:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月1日
下一篇 2022年5月1日

相关推荐