1.现代操作系统:
OS X,UNIX,Linux,Windows 等都是支持“多任务”的操作系统
单核CPU:通过操作系统轮流让各个任务交替执行,从CPU的视角看,每个任务都是交替执行的,由于CPU的执行速度非常快,我们感觉就像所有任务都在同时执行一样。
多核CPU:由于任务数量远远多于CPU的核心数量,操作系统会自动把很多任务轮流调度到每个核心上执行。
一个正在执行的任务就是一个进程,比如打开一个浏览器就是启动一个浏览器进程
2.启动进程实现多任务:
from multiprocessing import Process
def func(str):
while True:
print("hi hi %s"%(str))
time.sleep(1.2)
if __name__=="__main__":
print("主进程启动")
#创建子进程
#target说明进程执行的任务
p = Process(target=func,args=(“ ”,))
#启动进程
p.start()
while True:
print("hello hellio")
time.sleep(1)
#os.getpid()获取当前进程的ID号
#os.getppid()获取当前进程的父进程的id号
3.父子进程的先后顺序
from multiprocessing import Process
def func():
print("子进程启动")
time.sleep(3)
print("子进程结束")
if __name__=="__main__":
print("父进程启动")
p=Process(target=func)
p.strat()
print("父进程结束")
程序执行结果:父进程启动
父进程结束
子进程启动
子进程结束
#父进程的结束不能影响子进程,让父进程等子进程结束再执行父进程:
p.join()
4.全局变量在多个进程中不能共享
num = 100
def func():
print("子进程开始")
global num
num+=1
print(num)
print("子进程结束")
if __name__="__main__":
print("父进程开始")
p=Process(target=func)
p.start()
p.join()
print(num)
print("父进程结束")
#在创建子进程时对全局变量做了备份,父进程与子进程中的num是两个完全不同的变量
5.启动大量子进程
def func(name):
print("子进程%d启动--%s"%(name,os.getpid() ))
start = time.time()
time.sleep(random.choice([1,2,3]))
end = time.time()
print("子进程%d结束--%s--耗时%.2f")%(name,os.getpid(),end-start)
if __name__ =="__main__":
print("父进程启动")
#创建多个进程,进程池
p=Pool(2)
for i in rang(3):
#创建进程,放入进程池
p.apply_async(run,args=(i,))
#调用join前必须先调用close,调用close后不能再继续添加新的进程
p.close()
p.join()
print("父进程结束")
6.实现文件拷贝
import os
from multiprocessing import Pool
#复制文件的方法
def copyFile(rPath,wPath):
fr = open(rpath,"rb")
fw = open(wpath,"wb")
context = fr.read()
fw.write(context)
fr.close()
fw.close()
path=" "
topath=" "
#读取路径下的所有文件
fileList = os.listdir(path)
#启动for循环处理每一个文件
start = time.time()
for fileName in fileList:
copyFile(os.path.join(path,fileName),os.path.join(topath.fileName))
end = time.time()
print("总耗时%0.2f"%(end-start))