进程:
什么是进程
进程指的是一个程序的运行过程,或者说一个正在执行的程序
所以说进程一种虚拟的概念,该虚拟概念起源操作系统
串行: 一个任务完完整整运行完毕才能执行下一个任务
并发: 多个任务看起来是同时运行的,单核下就能实现并发(并发=切换+保存状态)
并行: 多个任务是真正意义上的同时运行,只有多核才能实行并行
开启子进程的俩种方式
from multiprocessing import Process import time def task(name): print('%s is running' %name) time.sleep(3) print('%s is done' %name) # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中 if __name__ == '__main__': p=Process(target=task,args=('egon',)) #或者这样写Process(target=task,kwargs={'name':'egon'}) p.start() # 只是向操作系统发送了一个开启子进程的信号 print('主') 结果: 主 egon is running egon is done
from multiprocessing import Process import time class Myprocess(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s is running' %self.name) time.sleep(3) print('%s is done' %self.name) # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中 if __name__ == '__main__': p=Myprocess('egon') p.start() # 只是向操作系统发送了一个开启子进程的信号 print('主') 结果: 主 egon is running egon is done
join:让主进程在原地等待,等待子进程运行完毕,不会影响子进程的执行
from multiprocessing import Process import time def task(name,n): print('%s is running' %name) time.sleep(n) print('%s is done' %name) if __name__ == '__main__': p1=Process(target=task,args=('子1',1)) p2=Process(target=task,args=('子2',2)) p3=Process(target=task,args=('子3',3)) #第一种 start=time.time() p1.start() p2.start() p3.start() time.sleep(5) p3.join() #3 p1.join() p2.join() print('主',(time.time()-start)) #第二种 start=time.time() p_l=[] for i in range(1,4): p = Process(target=task, args=('子%s' %i, i)) p_l.append(p) p.start() for p in p_l: p.join() print('主', (time.time() - start)) 结果: 子2 is running 子1 is running 子3 is running 子1 is done 子2 is done 子3 is done 主 5.143582582473755
进程之间内存空间相互隔离
from multiprocessing import Process n=100 def task(): global n n=0 #子进程 # if __name__ == '__main__': # p=Process(target=task) # p.start() # p.join() # print(n) 结果:100 #主进程 task() print(n) 结果:0
进程pid:每一个进程在操作系统内都有一个唯一的id号,称之为pid
from multiprocessing import Process,current_process import time def task(): print('%s is running' %current_process().pid) time.sleep(10) print('%s is done' %current_process().pid) if __name__ == '__main__': p=Process(target=task) p.start() print('主',current_process().pid) #可以在cmd中使用tasklist |findstr 进程号 看到 结果: 主 11956 11660 is running 11660 is done
进程对象其他相关的属性或方法
from multiprocessing import Process import time,os def task(): print('%s is running 爹是:%s' %(os.getpid(),os.getppid())) time.sleep(5) print('%s is done 爹是:%s' %(os.getpid(),os.getppid())) if __name__ == '__main__': p=Process(target=task) p.start() print('主:%s 主他爹:%s' %(os.getpid(),os.getppid())) 结果: 主:11508 主他爹:4920 9928 is running 爹是:11508 9928 is done 爹是:11508
from multiprocessing import Process,current_process import time,os def task(): print('%s is running 爹是:%s' %(os.getpid(),os.getppid())) time.sleep(10) print('%s is done 爹是:%s' %(os.getpid(),os.getppid())) if __name__ == '__main__': p=Process(target=task,name='子进程1') p.start() print(p.name) p.terminate() #杀死子进程 time.sleep(0.1) print(p.is_alive()) #判断是否还在运行 print('主:%s 主他爹:%s' %(os.getpid(),os.getppid())) 结果: 子进程1 False 主:10948 主他爹:4920