python 进程
一、基础知识
1、什么是进程
进程:运行的程序
2、进程和程序的区别
进程:动态
程序:静态
3、进程的状态
Ready Running Blocked
4、进程的生命周期
结束标志
子进程:子进程的代码执行结束
主进程:主进程的代码执行结束
子进程的主进程:子进程的执行时间大于主进程,子进程执行结束
主进程的执行时间大于子进程,主进程执行结束
5、同步/异步/阻塞/非阻塞
同步:串行
异步:并行
阻塞:input time.sleep()等
非阻塞:没有阻塞
二、开启进程
父进程和子进程有独立的内存空间,互不干涉
子进程与子进程之间也各有独立的内存空间,互不干涉
""" 同步 函数和程序的PID一致 """ import os def test(): print('Hello World!') print('How are you?') print('函数的PID %s' % os.getpid()) test() print('fine') print('这个程序的PID %s' % os.getpid()) """ Hello World! How are you? 函数的PID 260 fine 这个程序的PID 260 """
# 异步 # 将函数变成子进程 from multiprocessing import Process def test(): print('Hello, World!') print('I like money......') # Windows系统执行进程必要条件 if __name__ == '__main__': p = Process(target=test) # 注册(实例化对象) p.start() # 开启子进程 进程的执行:Ready->Running->Block->Ready print('abc') """ 结果: abc Hello, World! I like money...... """
# 异步,进程 # 查看进程的子进程 from multiprocessing import Process import os import time def test(): print('你好') print('子进程的PID:%s' % os.getpid()) if __name__ == '__main__': p = Process(target=test) p.start() print('How are you?') time.sleep(5) # 子进程执行完后,再执行下面的语句 print('父进程的PID:%s' % os.getpid()) """ 结果: How are you? 你好 子进程的PID:13852 父进程的PID:8180 """
""" 传递参数 查看子进程,子进程的父进程 查看父进程,父进程的父进程 """ from multiprocessing import Process import os def test(args): print('Are you ok? 演唱者: {}'.format(args)) print('子进程的PID: %s' % os.getpid()) print('子进程的父进程的PID: %s' % os.getppid()) if __name__ == '__main__': p = Process(target=test, args=('雷军', )) # 传递参数,args=tuple p.start() print('父进程的PID: %s' % os.getpid()) print('父进程的父进程: {}'.format(os.getppid())) """ 结果: 父进程的PID: 13568 父进程的父进程: 3352 Are you ok? 演唱者: 雷军 子进程的PID: 6148 子进程的父进程的PID: 13568 """
三、开启多进程
1、创建多个对象
2、使用for循环
# 创建多个子进程 # 子进程之间是异步,互不干扰,都有独立的内存空间 from multiprocessing import Process import time def test(args1): time.sleep(2) print(args1) def test2(args1): print(args1) if __name__ == '__main__': p = Process(target=test, args=('joker', )) p.start() p1 = Process(target=test2, args=('loss', )) p1.start() """ 结果: loss joker """
# 使用for循环,创建多个子线程 # 子线程之间是异步,都有独立的内存空间,互不干涉,互不影响 from multiprocessing import Process def for_fun(args): print('*'*args) if __name__ == '__main__': for i in range(1, 5): p = Process(target=for_fun, args=(i, )) p.start() """ 结果: ** * *** **** """
四、join()
作用:人为控制,运行完子进程后,运行父进程,把子进程和父进程从异步->同步
import os from multiprocessing import Process def test(args1): print('Hello {}'.format(args1)) print('子进程的PID: %s' % os.getpid()) print('子进程的父进程PID: {}'.format(os.getppid())) if __name__ == '__main__': p = Process(target=test, args=('tom', )) p.start() p.join() # join()方法,察觉子进程结束,异步->同步 print('父进程的PID: %s' % os.getpid()) print('父进程的父进程PID: {}'.format(os.getppid())) """ 结果: Hello tom 子进程的PID: 15772 子进程的父进程PID: 7320 父进程的PID: 7320 父进程的父进程PID: 14600 """
# 子线程执行完毕后,再执行父线程 # 子线程异步,所有子线程与父线程同步 from multiprocessing import Process def test(args1): print('*'*args1) li_p = [] if __name__ == '__main__': for i in range(1, 5): p = Process(target=test, args=(i, )) li_p.append(p) p.start() [i.join() for i in li_p] print('+++++++++++++++++++')
五、面向对象创建进程
""" 1.自定义类,继承Process 2.初始化__init__()方法,并继承父类,目的传递参数 3.run()方法,内部填写子进程执行的代码 4.实例化对象,通过自定义类 """ import time from multiprocessing import Process class MyProcess(Process): def __init__(self, args1): super(MyProcess, self).__init__() self.args1 = args1 def run(self) -> None: print('你好, %s' % self.args1) time.sleep(2) print('Hello') if __name__ == '__main__': p = MyProcess('tom') p.start() print('abc') # p.join() print('只要坚持住,老子天下无敌!!!') """ 结果: abc 只要坚持住,老子天下无敌!!! 你好, tom Hello """
from multiprocessing import Process class MyProcess(Process): def __init__(self, args1): super(MyProcess, self).__init__() self.args1 = args1 def run(self) -> None: print('*'*5*self.args1) if __name__ == '__main__': list_p = [] for i in range(2, 6): p = MyProcess(i) list_p.append(p) p.start() [i.join() for i in list_p] print('+++++++++++++++++++++++++++++') """ 结果: ********** ******************** *************** ************************* +++++++++++++++++++++++++++++ """
self.pid() 当前进程的PID值
sel.name() 当前进程的名字
from multiprocessing import Process class MyProcess(Process): def __init__(self): super(MyProcess, self).__init__() def run(self) -> None: print(self.pid) # 获取该子进程的PID值 print(self.name) # 获取该子进程的进程名 if __name__ == '__main__': for i in range(3): p = MyProcess() p.start() """ 结果: 916 MyProcess-3 4864 MyProcess-1 15140 MyProcess-2 """