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正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
详解Python中的循环语句的用法
Apr 09 Python
Python之re操作方法(详解)
Jun 14 Python
详解Django 中是否使用时区的区别
Jun 14 Python
对Python发送带header的http请求方法详解
Jan 02 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
django重新生成数据库中的某张表方法
Aug 28 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
python开发人人对战的五子棋小游戏
May 02 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/04/21 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python网络编程学习笔记(一)
2014/06/09 Python
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python解析json文件相关知识学习
2016/03/01 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
培训自我鉴定
2014/01/31 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
七一建党节慰问信
2015/02/14 职场文书
刑事附带民事代理词
2015/05/25 职场文书
入党积极分子考察意见
2015/06/02 职场文书
师范生小学见习总结
2015/06/23 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis