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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
跟老齐学Python之通过Python连接数据库
Oct 28 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
用Python抢过年的火车票附源码
Dec 07 Python
Django处理文件上传File Uploads的实例
May 28 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
python对数组进行反转的方法
2015/05/20 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
python3将变量输入的简单实例
2020/08/19 Python
印度在线杂货店:bigbasket
2018/08/23 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
护理专业自我鉴定
2014/01/30 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
大学生自我鉴定书
2014/03/24 职场文书
购房委托书
2014/10/15 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
浅析python中特殊文件和特殊函数
2022/02/24 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫