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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
python使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
Python使用新浪微博API发送微博的例子
Apr 10 Python
python uuid模块使用实例
Apr 08 Python
Django权限机制实现代码详解
Feb 05 Python
PyQt5实现下载进度条效果
Apr 19 Python
详解python配置虚拟环境
Apr 08 Python
使用Python制作表情包实现换脸功能
Jul 19 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
Python基于字典实现switch case函数调用
Jul 22 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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
PHP动态图像的创建
2006/10/09 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
JS 自定义带默认值的函数
2011/07/21 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
餐饮加盟计划书
2014/01/10 职场文书
安全协议书范本
2014/04/21 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
2014年物流工作总结
2014/11/25 职场文书
安全保证书怎么写
2015/02/28 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
MySQL 原理与优化之Update 优化
2022/08/14 MySQL