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对两个有序列表进行合并和排序的例子
Jun 13 Python
Python中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python itertools模块详解
May 09 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
详解python3百度指数抓取实例
Dec 12 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
python 全文检索引擎详解
Apr 25 Python
Python数据集切分实例
Dec 08 Python
python实现交并比IOU教程
Apr 16 Python
python中的测试框架
Nov 13 Python
Spy++的使用方法及下载教程
Jan 29 Python
python区块链持久化和命令行接口实现简版
May 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
php查看网页源代码的方法
2015/03/13 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python切片知识解析
2016/03/06 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
党校学习自我鉴定
2014/02/24 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
2014年手术室工作总结
2014/11/26 职场文书
幼儿学前班评语
2014/12/29 职场文书
解决python3安装pandas出错的问题
2021/05/20 Python
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL