python——进程池
from concurrent.futures import ProcessPoolExecutor import os,random def func(name): print("%s吃了又一碗饭:%s" %(name,os.getpid())) time.sleep(random.randint(1, 3)) if __name__ == "__main__": p = ProcessPoolExecutor(3) #创建一个进程池,里面容纳3个进程 for i in range(7): obj = p.submit(func,'科比%i'%i) print("主进程") #执行结果 主进程 科比0吃了又一碗饭:14860 科比1吃了又一碗饭:4872 科比2吃了又一碗饭:15088
科比3吃了又一碗饭:14860 科比4吃了又一碗饭:14860 科比5吃了又一碗饭:14860 科比6吃了又一碗饭:4872
再看下一个例子:
from concurrent.futures import ProcessPoolExecutor import os,random def func(name): print("%s吃了又一碗饭:%s" %(name,os.getpid())) time.sleep(random.randint(1, 3)) if __name__ == "__main__": p = ProcessPoolExecutor(3) #创建一个进程池,里面容纳3个进程 for i in range(7): obj = p.submit(func,'科比%i'%i) p.shutdown(wait=True) #类似与join,并且可以关门,以防在等的过程中又提交新的任务 print("主进程") #执行结果 科比0吃了又一碗饭:13980 科比1吃了又一碗饭:9636 科比2吃了又一碗饭:12660 科比3吃了又一碗饭:13980 科比4吃了又一碗饭:12660 科比5吃了又一碗饭:9636 科比6吃了又一碗饭:13980 主进程
同步:执行之后等着结果
from multiprocessing import Process
import time,os,random def func(name,hour): print("A lifelong friend:%s,%s"% (name,os.getpid())) time.sleep(hour) print("Good bother:%s"%name) start = time.time() if __name__ == "__main__": p = Process(target=func,args=('kebi',2)) p1 = Process(target=func,args=('maoxian',1)) p2 = Process(target=func,args=('xiaoniao',3)) p_1 = [p,p1,p2] for i in p_1: i.start() #提交之后原地等着,这就是串行 i.join()
print("this is over") print(time.time() - start) #打印结果 A lifelong friend:kebi,13016 Good bother:kebi A lifelong friend:maoxian,9124 Good bother:maoxian A lifelong friend:xiaoniao,1552 Good bother:xiaoniao this is over 6.487138032913208 #一个一个执行
串行是我们要避免的,这回浪费系统资源。
同步不代表串行,同步只是提交任务的方式。
from concurrent.futures import ProcessPoolExecutor import os,random,time def func(name,i): print("%s吃了又一碗饭:%s" %(name,os.getpid())) time.sleep(random.randint(1,3)) return i**2 obj_s = [] if __name__ == "__main__": p = ProcessPoolExecutor(3) #创建一个进程池,里面容纳3个进程 for i in range(7): obj = p.submit(func,'科比%i'%i,i) obj_s.append(obj) for m in obj_s: print(m.result()) #执行结果 科比0吃了又一碗饭:3972 科比1吃了又一碗饭:12232 科比2吃了又一碗饭:204 科比3吃了又一碗饭:12232 科比4吃了又一碗饭:204 科比5吃了又一碗饭:3972 #先执行,最后取结果结果 0 1 4 科比6吃了又一碗饭:204 9 16 25 36
如果就像执行完了之后再打印结果
from concurrent.futures import ProcessPoolExecutor import os,random,time start = time.time() def func(name,i): print("%s吃了又一碗饭:%s" %(name,os.getpid())) time.sleep(random.randint(1,3)) return i**2 obj_s = [] if __name__ == "__main__": p = ProcessPoolExecutor(3) #创建一个进程池,里面容纳3个进程 for i in range(7): obj = p.submit(func,'科比%i'%i,i) obj_s.append(obj) p.shutdown() for m in obj_s: print(m.result()) #执行结果 科比0吃了又一碗饭:16320 科比1吃了又一碗饭:12048 科比2吃了又一碗饭:1152 科比3吃了又一碗饭:16320 科比4吃了又一碗饭:12048 科比5吃了又一碗饭:1152 科比6吃了又一碗饭:16320 0 1 4 9 16 25 36