万叶集 |
---|
隐约雷鸣,阴霾天空。 |
但盼风雨来,能留你在此。 |
专栏系列(点击解锁) 学习路线指引 知识定位 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>
其实不然,在我们的使用进程池的 方法时,是通过异步的方式实现的,而异步是可以获取返回值的。针对上述脚本,我们在 中针对每一个异步 添加一个变量名,从而获取返回值。
示例代码如下:
运行结果如下:

从运行结果可以看出,首先 函数被线程池的线程执行了一遍,当第一组任务执行完毕紧接着执行第二次线程池任务的时候,打印输出了 的返回值,证明返回值被成功的返回了。然后继续下一组的任务…
这些都是主要依赖于 ,关于 的更多知识会在 的章节进行详细的介绍。
进程锁
进程锁的概念
锁:大家都知道,我们可以给一个大门上锁。
结合这个场景来举一个例子:比如现在有多个进程同时冲向一个 ,当前门内是没有 “人”的(其实就是进程),锁也没有锁上。当有一个进程进去之后并且把 “门” 锁上了,这时候门外的那些进程是进不来的。在门内的 “人” ,可以在 “门” 内做任何事情且不会被干扰。当它出来之后,会解开门锁。这时候又有一个 “人” 进去了门内,并且重复这样的操作,这就是 。它可以让锁后面的工作只能被一个任务来处理,只有它解锁之后下一个任务才会进入,这就是 “锁” 的概念。
而 就是仅针对于 有效的锁,当进程的任务开始之后,就会被上一把 “锁”;与之对应的是 ,它们的原理几乎是一样的。
进程锁的加锁与解锁
进程锁的使用方法:
通过 multiprocessing 导入 Manager 类
然后实例化 Manager
再然后通过实例化后的 manager 调用 它的 Lock() 函数
接下来,就需要操作这个 lock 对象的函数
函数名 介绍 参数 返回值 acquire 上锁 无 无 release 解锁(开锁) 无 无
代码示例如下:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!