一、多进程
多任务:生活中来看,就是多个任务同时进行,喝酒聊天,开车,手脚并用,唱歌跳舞
电脑中:录屏、sublime、vnc服务端、浏览器打开等
代码中:实现多任务,多进程、多线程
进程:电脑中,每一个软件启动起来都是一个进程,
代码中:没有运行的时候称之为程序,运行起来之后就是一个进程
多进程:进程只有一个,称之为主进程,子进程,要实现两个函数同时执行,就要通过主进程来创建子进程
操作系统实现,只是在进程之间来回切换,切换的非常快,看着像同时执行一样
代码实现?
面向过程实现的时候:(process)
p = Process(target=xxx, name=xxx, args=(xxx,))
target: 进程启动之后要执行的函数
name: 给进程起个名字
args: 给子进程传递的参数,是一个元组
p.start() 启动进程
p.join() 让主进程等待子进程结束
os.getpid() 获取当前进程id号
os.getppid() 获取父进程的id号
面向对象:
见代码
*****************************************************************************
from multiprocessing import Process
import time
class SingProcess(Process):
def __init__(self, a):
# 如果要重写构造方法,一定得手动调用父类的构造方法
super().__init__()
self.a = a
def run(self):
print('传递的参数为%s' % self.a)
for x in range(1, 5):
print('我在唱小情歌')
time.sleep(1)
class DanceProcess(Process):
def run(self):
for x in range(1, 5):
print('我在跳钢管舞')
time.sleep(1)
def main():
a = '现在很多老歌手为什么不唱歌了'
p_sing = SingProcess(a)
# 启动进程,进程启动之后默认执行类里面的run方法
p_sing.start()
# p_dance = DanceProcess()
# p_dance.start()
p_sing.join()
# p_dance.join()
print('主进程结束')
if __name__ == '__main__':
main()
*****************************************************************************************
全局变量
进程之间是否共享全局变量,不共享
每一个进程都是单独的代码
进程池
多进程拷贝,拷贝文件夹,假如文件夹里面只有文件。假如有100个文件,那么拷贝的时候先拷贝第一个,然后第二个,然后第三个====
拷贝一个文件就是一个任务,那一共100文件,那难道要开辟100个进程吗?
进程并不是越多越好,切换占用的时间越大
练习:多进程拷贝
拷贝之前记录时间戳,拷贝之后记录时间戳,计算拷贝的时间
多进程拷贝也是一样,哪个时间短
引入进程池,规定能创建几个进程,来了任务,5个进程