python学习笔记之多进程


Posted in Python onAugust 06, 2020

我们现代的操作系统,都是支持“多任务”的操作系统,对于操作系统来说,一个任务就是一个进程(process)。比如打开一个浏览器就是启动一个浏览器进程。

如果我们将计算器的核心CPU比喻为一座工厂,那么进程就像工厂里的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

看到这大家可能会有一些疑问了,其他进程处于非运行状态?可是我用浏览器访问网页的时候,音乐播放器明明也在运行啊。

实际上是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

Python中的多进程

在UNIX/LINUX操作系统中,可以使用fork()函数来创建。fork函数比其他普通函数有一点特殊之处,就是普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

fork()函数被封装在os模块中。接下来,我们举例说明使用多进程和不使用多进程的区别:

from random import randint

from time import time, sleep

def download_task(filename):

print('开始下载%s...' % filename)

time_to_download = randint(5, 10)

sleep(time_to_download)

print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))

def main():

start = time()

download_task('MySQL从删库到跑路.pdf')

download_task('万万没想到.mp4')

end = time()

print('总共耗费了%.2f秒.' % (end - start))if __name__ == '__main__':

main()

执行结果:

开始下载MySQL从删库到跑路.pdf...

MySQL从删库到跑路.pdf下载完成! 耗费了9秒

开始下载万万没想到.mp4...

万万没想到.mp4下载完成! 耗费了9秒

总共耗费了18.00秒.

从上面的例子可以看出,如果程序中的代码只能按顺序一点点的往下执行,那么即使执行两个毫不相关的下载任务,也需要先等待一个文件下载完成后才能开始下一个下载任务,很显然这并不合理也没有效率。接下来我们使用多进程的方式将两个下载任务放到不同的进程中,代码如下所示:

from multiprocessing import Process

from os import getpid

from random import randint

from time import time, sleep

def download_task(filename):

print('启动下载进程,进程号[%d].' % getpid()) print('开始下载%s...' % filename) time_to_download = randint(5, 10)

sleep(time_to_download)

print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))

def main():

start = time()

p1 = Process(target=download_task, args=('MySQL从删库到跑路.pdf', ))

p1.start()

p2 = Process(target=download_task, args=('万万没想到.mp4', ))

p2.start()

p1.join()

p2.join()

end = time()

print('总共耗费了%.2f秒.' % (end - start))

if __name__ == '__main__': main()

执行结果:

启动下载进程,进程号[568408].

开始下载万万没想到.mp4...万万没想到.

mp4下载完成! 耗费了6秒

启动下载进程,进程号[565896].

开始下载MySQL从删库到跑路.

pdf...MySQL从删库到跑路.pdf下载完成! 耗费了10秒

总共耗费了10.09秒.

运行上面的代码可以明显发现两个下载任务“同时”启动了,而且程序的执行时间将大大缩短,不再是两个任务的时间总和。

以上就是python学习笔记之多进程的详细内容,更多关于Python多进程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现数通设备端口监控示例
Apr 02 Python
Python文件操作类操作实例详解
Jul 11 Python
Python标准库sched模块使用指南
Jul 06 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
用python拟合等角螺线的实现示例
Dec 27 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
Python tkinter和exe打包的方法
Feb 05 Python
python打开文件的方式有哪些
Jun 29 Python
Python常用数据分析模块原理解析
Jul 20 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
Selenium alert 弹窗处理的示例代码
Aug 06 #Python
Python如何进行时间处理
Aug 06 #Python
Python学习笔记之装饰器
Aug 06 #Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 #Python
Python爬虫防封ip的一些技巧
Aug 06 #Python
Python无损压缩图片的示例代码
Aug 06 #Python
通过实例简单了解python yield使用方法
Aug 06 #Python
You might like
Sony CFR 320 修复改造
2020/03/14 无线电
收集的DedeCMS一些使用经验
2007/03/17 PHP
php self,$this,const,static,->的使用
2009/10/22 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
php适配器模式简单应用示例
2019/10/23 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
javascript常用对话框小集
2013/09/13 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
Python魔术方法详解
2015/02/14 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
python交互界面的退出方法
2019/02/16 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
详解python polyscope库的安装和例程
2020/11/13 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
毕业自荐书
2013/12/09 职场文书
年终晚会主持词
2014/03/25 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
导游词之南京栖霞山
2019/10/18 职场文书