时间:2021-05-22
我们现代的操作系统,都是支持“多任务”的操作系统,对于操作系统来说,一个任务就是一个进程(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 randintfrom time import time, sleepdef 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 Processfrom os import getpidfrom random import randintfrom time import time, sleepdef 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多进程的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言:python多进程,经常在使用,却没有怎么系统的学习过,官网上面讲得比较细,结合自己的学习,整理记录下官网:https://docs.python.org
python多线程和多进程区别是: 1、多线程可以共享全局变量,而多进程是不能的。 2、多线程中,所有子线程的进程号相同;多进程中不同的子进程进程号不同。
本文实例讲述了nodejs基础之多进程。分享给大家供大家参考,具体如下:Node.js多进程我们都知道Node.js是以单线程的模式运行的,但它使用的是事件驱动
比较好奇python对于多进程中copyonwrite机制的实际使用情况。目前从实验结果来看,python使用multiprocessing来创建多进程时,无论
想要充分利用多核CPU资源,Python中大部分情况下都需要使用多进程,Python中提供了multiprocessing这个包实现多进程。multiproce