知识储备

进程: 进程就是一个正在执行的过程,或者说一个软件的运行过程 进程是一个虚拟的概念 进程的概念起源:操作系统 操作系统发展史 批处理操作系统:(串行) 把程序员的程序攒成一堆 然后批处理系统读一道程序到内存然后执行 执行完毕后输出,然后才能读入下一道程序 多道技术: 产生背景:在单核下实现并发 两大核心点: 1、空间的复用 多道程序同时读入内存中。等到被 CPU执行,即产生了多个进程 强调:进程之间的内存空间是互相隔离的,而且这种隔离栅物理级别 2、时间的复用 复用CPU的时间 切: 1、正在执行的进程遇到I/O操作(提升效率) 2、正在执行的进程,占用时间过长, 或优先级更高的进程抢走的CPU执行权限(降低效率) 并发:本质是切换+保存状态 并行 串行:一个进程正在使用CPU,其他进程均在等待(区别于阻塞) 阻塞:正在运行的进程,遇到I/O,被剥夺了CPU的使用权限 非阻塞
进程,操作系统(win,unix)里管理的单位:
win:父、子进程是各自不同的地址空间
unix:每开启一个子进程,子进程的初始数据,是主进程的一个副本
开启(申请)进程的两种方式:

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2018/04/24 10:29 4 # @Author : MJay_Lee 5 # @File : 02开启进程.py 6 # @Contact : limengjiejj@hotmail.com 7 8 import time 9 from multiprocessing import Process 10 11 def task(name): 12 print('%s is running' % name) 13 time.sleep(3) 14 print('%s is done' % name) 15 16 if __name__ == '__main__': 17 # 在windows系统上,开启子进程的操作一定要放到此步骤下面,unix则不用 18 # Process(target=task,kwargs={'name':'egon'}) 方式一 关键字赋值 19 p = Process(target=task,args=('egon',)) # 方式二,args传值是元组,勿忘逗号 20 p.start() # 想操作系统发送请求,操作系统会申请内存空进啊,然后把父进程的数据拷贝给子进程,作为子进程的初始状态 21 print('========主')

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2018/04/24 10:48 4 # @Author : MJay_Lee 5 # @File : 03开启进程方式二.py 6 # @Contact : limengjiejj@hotmail.com 7 8 import time 9 from multiprocessing import Process 10 11 class MyProcess(Process): 12 def __init__(self,name): 13 super(MyProcess,self).__init__() 14 self.name = name 15 def run(self): 16 print('%s is running' % self.name) 17 time.sleep(3) 18 print('%s is done' % self.name) 19 20 if __name__ == '__main__': 21 p = MyProcess('lmj') 22 p.start() 23 print('====>主')
子进程等待父进程结束:

1 import time 2 from multiprocessing import Process 3 4 def task(n): 5 print('%s is running' % n) 6 time.sleep(n) 7 8 if __name__ == '__main__': 9 p_list = [] 10 for i in range(1,4): 11 p = Process(target=task,args=(i,)) 12 p_list.append(p) 13 p.start() 14 15 for p in p_list: 16 p.join() 17 18 print('====>主') 19 20 """ 21 3 is running 22 2 is running 23 1 is running 24 ====>主 25 """
子进程ppid方法的认识:
https://segmentfault.com/q/1010000014562902?_ea=3668830

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2018/04/24 12:02 4 # @Author : MJay_Lee 5 # @File : 05进程对象????.py 6 # @Contact : limengjiejj@hotmail.com 7 8 # import time,os 9 # from multiprocessing import Process 10 # 11 # def task(): 12 # print('self:%s parent:%s' %(os.getpid(),os.getppid())) 13 # time.sleep(3) 14 # 15 # if __name__ == '__main__': 16 # p1 = Process(target=task,) 17 # p1.start() 18 # 19 # print(p1.pid) 20 # # print(p1.ppid) 21 # print('====>主',os.getpid()) 22 23 24 import time,os 25 from multiprocessing import Process 26 27 class Myprocess(Process): 28 def __init__(self,name): 29 super(Myprocess,self).__init__() 30 self.name = name 31 32 def run(self): 33 print('子进程:\033[1;32;40m%s\033[0m 父进程:\033[1;31;40m%s\033[0m' %(os.getpid(),os.getppid())) 34 print('系统调用执行子进程,等待3秒') 35 time.sleep(3) 36 37 @property 38 def ppid(self): 39 return os.getpid() 40 41 42 if __name__ == '__main__': 43 p1 = Myprocess('进程对象') 44 p1.start() 45 print('%s,的pid:\033[1;32;40m%s\033[0m' % (p1.name,p1.pid)) 46 print('%s,的ppid:\033[1;31;40m%s\033[0m' % (p1.name,p1.ppid)) 47 print('【主进程】:',os.getpid()) 48 time.sleep(5)