多进程编程的3种方法
多进程的编程方法1,创建Process的实例,传入任务执行函数作为参数程序代码:
import os,time from multiprocessing import Process def worker(arg): for i in range(5): print("子进程执行中>>> 子进程id={0},父进程id={1},子进程编号{2}".format(os.getpid(),os.getppid(),arg)) time.sleep(1) print("子进程终止,id={0}".format(os.getpid())) def main(num): print("主进程执行中>>> 主进程id={0}".format(os.getpid())) ps=[] for i in range(num): # 创建子进程实例 p=Process(target=worker,args=(i,)) ps.append(p) for i in range(num): # 开启进程 ps[i].start() for i in range(num): # 阻塞进程 ps[i].join() print("主进程终止") if __name__ == '__main__': num = 3 # 要创建的进程数量 main(num)
多进程的编程方法2,派生Process的子类,重写run方法
程序代码:
import os,time from multiprocessing import Process class MyProcess(Process): def __init__(self,arg): self.arg = arg Process.__init__(self) def run(self): print("子进程开始>>> 子进程id={0},主进程id={1}".format(os.getpid(),os.getppid())) for i in range(5): print("子进程执行中...子进程id={0},子进程编号{1}".format(os.getpid(),self.arg)) time.sleep(1) print("子进程终止,子进程id={}".format(os.getpid())) def main(num): p = [] print("主进程开始>>> 主进程id={}".format(os.getpid())) for i in range(num): myp=MyProcess(i) # i为传进子程序的参数 p.append(myp) for i in range(num): p[i].start() # myp.join() print("主进程终止") if __name__ == '__main__': main(3)
多进程的编程方法3,使用进程池Pool
程序代码:
import os,time from multiprocessing import Pool def worker(arg): print("子进程开始执行>>> 子进程id={},主进程id={},编号{}".format(os.getpid(),os.getppid(),arg)) time.sleep(1) print("子进程终止>>> 子进程id={},编号{}".format(os.getpid(),arg)) def main(p_num,w_num): print("主进程开始执行>>> 主进程id={}".format(os.getpid())) ps=Pool(p_num) #p_num进程池的任务数 for i in range(w_num): #w_num总任务数 # ps.apply(worker,args=(i,)) # 同步执行 ps.apply_async(worker,args=(i,)) # 异步执行 # 关闭进程池,停止接受其它进程 ps.close() # 阻塞进程 ps.join() print("主进程终止") if __name__ == '__main__': main(5,20) # 进程池任务数,总任务数