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 相关文章推荐
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 Python
Python实现的Excel文件读写类
Jul 30 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
Python中垃圾回收和del语句详解
Nov 15 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
python框架django项目部署相关知识详解
Nov 04 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 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设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP时间类完整代码实例
2021/02/26 PHP
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
pycharm配置git(图文教程)
2019/08/16 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
亚马逊印度站:Amazon.in
2017/10/15 全球购物
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
医务人员自我评价
2014/01/26 职场文书
致100米运动员广播稿
2014/02/14 职场文书
企业文化建设实施方案
2014/03/22 职场文书
售房协议书范本
2015/08/11 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
详解Flask开发技巧之异常处理
2021/06/15 Python