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处理Excel文件实例代码
Jun 20 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
如何使用Python自动控制windows桌面
Jul 11 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
python中with用法讲解
Feb 07 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
Python机器学习三大件之一numpy
May 10 Python
matlab xlabel位置的设置方式
May 21 Python
python保存图片的四个常用方法
Feb 28 Python
Python if else条件语句形式详解
Mar 24 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操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
Vue之Watcher源码解析(1)
2017/07/19 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
webpack的tree shaking的实现方法
2019/09/18 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
python集合类型用法分析
2015/04/08 Python
Python实现控制台进度条功能
2016/01/04 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
NumPy中的维度Axis详解
2019/11/26 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
同居协议书范本
2014/04/23 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
法人代表资格证明书
2015/06/18 职场文书
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
vue实现拖拽交换位置
2022/04/07 Vue.js