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网络编程示例(客户端与服务端)
Apr 24 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
利用python中集合的唯一性实现去重
Feb 11 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
Pygame Time时间控制的具体使用详解
Nov 17 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目录管理函数小结
2008/09/10 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
详解Python循环作用域与闭包
2019/03/21 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
仓库管理专业个人的自我评价
2013/12/30 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
实习单位鉴定评语
2014/04/26 职场文书
房屋认购协议书
2015/01/29 职场文书
幼儿园辞职信
2015/05/13 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL