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 03 Python
Python CSV模块使用实例
Apr 09 Python
在Python中使用SimpleParse模块进行解析的教程
Apr 11 Python
Python的shutil模块中文件的复制操作函数详解
Jul 05 Python
Python之Web框架Django项目搭建全过程
May 02 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
django框架F&Q 聚合与分组操作示例
Dec 12 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
pandas 实现将NaN转换为None
May 14 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
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php 常用的系统函数
2017/02/07 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
在Python中使用HTML模版的教程
2015/04/29 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python pandas修改列属性的方法详解
2018/06/09 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python 读取.nii格式图像实例
2020/07/01 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
工程部经理岗位职责
2013/12/08 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
电视节目策划方案
2014/05/16 职场文书
新农村建设汇报材料
2014/08/15 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
优秀班组申报材料
2014/12/25 职场文书
技术支持岗位职责
2015/02/13 职场文书
最感人的道歉情书
2015/05/12 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书