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判断端口是否打开的实现代码
Feb 10 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
django输出html内容的实例
May 27 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
PyQt5图形界面播放音乐的实例
Jun 17 Python
NumPy统计函数的实现方法
Jan 21 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
Keras搭建自编码器操作
Jul 03 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
Vue AST源码解析第一篇
2017/07/19 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
python实现简单购物商城
2016/05/21 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
解决方案设计综合面试题
2015/08/31 面试题
网上开商店的创业计划书
2014/01/19 职场文书
安全责任协议书
2014/04/21 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
订货会邀请函
2015/01/31 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
花田少年史观后感
2015/06/16 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
MySQL窗口函数的具体使用
2021/11/17 MySQL
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android