#1、异步非阻塞: import os from multiprocessing import Process def func(): print('子进程:',os.getpid()) if __name__ == '__main__': p = Process(target = func) #创建一个进程对象。 print('主进程:',os.getpid()) p.start() #开启子进程,至于系统什么时候调度,不管它,先执行下面的代码,属于异步。 print('主进程:',os.getpid()) # 主进程: 14112 # 主进程: 14112 # 子进程:12860 #2、同步非阻塞: import os from multiprocessing import Process def func(): print('子进程:',os.getpid()) if __name__ == '__main__': #下面没有创建进程对象,只有一个进程,属于同步。 print('去银行取钱') func() print('取完钱了') # 去银行取钱 # 子进程: 5668 # 取完钱了 #3、异步阻塞: import os import time from multiprocessing import Process: def func(): print('子进程:',os.getpid()) if __name__ == '__main__': p = Process(target = func) print('主进程:',os.getpid()) p.start() #开启子进程 time.sleep(10) #主进程阻塞10秒,跟子进程没关系,不影响子进程,属于异步阻塞。 #4、同步阻塞: import os import time from multiprocessing import Process def func(): print('子进程:',os.getpid()) if __name__ == '__main__': print('去银行取钱') func() time.sleep(10) #只有一个进程,阻塞10秒,属于同步阻塞。 print('取完钱了') #5、父进程创建子进程:主进程和父进程的pid是一样的,说明它们是同一进程。主进程创建了子进程,也就是父进程创建了子进程。 import os from multiprocessing import Process def func(): print('子进程:',os.getpid()) print('父进程:',os.getppid()) if __name__ == '__main__': p = Process(target = func) p.start() print('主进程:',os.getpid()) # 主进程: 16284 # 子进程: 10972 # 父进程: 16284 #6、主进程控制子进程,主进程传参给子进程: import os from multiprocessing import Process def func(money): print('取%d元'%money) if __name__ == '__main__': p = Process(target = func,args = (8000000,)) #args是元祖 p.start() #取8000000元 #7、子进程优先执行,主进程阻塞: import os from multiprocessing import Process def func(): print('子进程',os.getpid()) if __name__ == '__main__': p = Process(target = func) p.start() p.join() #主进程等待子进程结束之后才结束,子进程执行,主进程阻塞在p.join()的位置 print('主进程',os.getpid()) #子进程 23080 #主进程 10912 #8、要求子进程重复三次,主进程最后才执行: import os from multiprocessing import Process def func(): print("子进程",os.getpid()) if __name__ == '__main__': p = Process(target = func) p1 = Process(target = func) p2 = Process(target = func) p.start() p1.start() p2.start() p.join() p1.join() p2.join() print('主进程',os.getpid()) # 子进程 7436 # 子进程 19988 # 子进程 17712 # 主进程 1464 #9、如果子进程重复很多次,上面代码就很麻烦,要使用for循环解决: import os from multiprocessing import Process def func(): print("子进程",os.getpid()) if __name__ == '__main__': p_list = [] for i in range(10): p = Process(target = func) p.start() p_list.append(p) for p in p_list: p.join() print('主进程',os.getpid()) #10、多个子进程开始,是无法知道哪个先执行,没有顺序的。但是在p.start()后面加上p.join()可以让当前子进程优先执行,这样就有顺序了。 import os from multiprocessing import Process def func(i): print('序号%d 子进程的pid是%d'%(i,os.getpid())) if __name__ == '__main__': for i in range(3): p = Process(target = func,args=(i,)) p.start() print('主进程',os.getpid()) # 主进程 1976 # 序号0 子进程的pid是17912 # 序号2 子进程的pid是15904 # 序号1 子进程的pid是17612 #11、多进程的特点:数据隔离。子进程之间的数据是隔离的,不共享,他们没有关系,互不影响。 # 在windows下,每创建一个子进程,都会创建一个空间对当前模块(day35-子进程的开启.py)的代码执行一遍, # 所以每创建一个子进程,n都是等于100。 from multiprocessing import Process n = 100 def func(i): global n n = n - 1 print(i,n) if __name__ == '__main__': for i in range(3): p = Process(target=func,args=(i,)) p.start() # 0 99 # 2 99 # 1 99 #12、使用子类继承父类的方式来开启子进程,并且传参:必须继承Process类和定义run方法。 import os from multiprocessing import Process class MyProcess(Process): #必须继承Process类。 def __init__(self,args1,args2,args3): super().__init__() #子类继承父类__init__方法里面的属性。 self.args1 = args1 self.args2 = args2 self.args3 = args3 def run(self): #必须定义一个run方法。 print('子进程:',os.getpid(),self.args1,self.args2,self.args3) self.walk() #调用walk方法,walk方法在子进程当中执行。 def walk(self): print('子进程walk方法',os.getpid()) if __name__ == '__main__': p = MyProcess(1,2,3) p.start() #默认调用run方法。 p.walk() #在主进程当中执行。 print('主进程',os.getpid()) # 子进程walk方法 756 #pid跟主进程的一样,证明在主进程当中执行。 # 主进程 756 # 子进程: 15124 1 2 3 # 子进程walk方法 15124 #pid一样,证明walk方法在子进程当中执行。