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 相关文章推荐
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python字符串和文件操作常用函数分析
Apr 08 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
Python 装饰器深入理解
Mar 16 Python
详解python实现读取邮件数据并下载附件的实例
Aug 03 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
pyqt5中动画的使用详解
Apr 01 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
浅谈python中的多态
Jun 15 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
Python序列化模块JSON与Pickle
Jun 05 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新手上路(四)
2006/10/09 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
Python中的高级函数map/reduce使用实例
2015/04/13 Python
Python切片操作实例分析
2018/03/16 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Python实现最常见加密方式详解
2019/07/13 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
Python线程threading模块用法详解
2020/02/26 Python
详解Python 中的容器 collections
2020/08/17 Python
python unichr函数知识点总结
2020/12/16 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
2014年情人节活动方案
2014/02/16 职场文书
就业意向书范文
2014/04/01 职场文书
励志演讲稿600字
2014/08/21 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
殡葬服务心得体会
2014/09/11 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
运动会广播稿300字
2015/08/19 职场文书