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中的hashlib和base64加密模块使用实例
Sep 02 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python selenium循环登陆网站的实现
Nov 04 Python
python SVD压缩图像的实现代码
Nov 05 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Django 解决由save方法引发的错误
May 21 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
如何用Python绘制3D柱形图
Sep 16 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 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
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
JavaScript 继承详解(四)
2009/07/13 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python取均匀不重复的随机数方式
2019/11/27 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
转让协议书范本
2014/04/15 职场文书
求职信格式要求
2014/05/23 职场文书
付款承诺函范文
2015/01/21 职场文书
市场总监岗位职责
2015/02/11 职场文书
男方婚前保证书
2015/02/28 职场文书
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers