三十一、Python 进程池和线程池
进程池
进程池中,在不申请进程的时候,不占用内存
进程池内部维护一个进程序列,当使用的时候,则去进程池中获取一个进程。如果进程池序列中没有可以提供使用的进程,那么程序就会等待,知道进程池中有可用进程为止。
2个常用的方法
apply 每一个任务是排队进行:使用进程.join()
apply_async 每一个任务是并发执行,可以设置回调函数,进程无join,进程daemon = True, 主进程不等待子进程。
回调函数,将func的返回结果作为函数传递给回调函数
如果希望apply_async 可以等待所有的子进程结束,需要使用pool.join方法。且前面需要使用pool.close() pool.terminate()
apply
1 from multiprocessing import Process, Pool 2 import time 3 4 def Foo(i): 5 time.sleep(2) 6 print(i,i+100) 7 return i+100 8 9 def Bar(arg): #回调函数 10 print(arg) 11 12 if __name__ == '__main__': 13 pool = Pool(5) 14 for i in range(2): 15 pool.apply(func= Foo,args = (i,)) #顺序执行,使用了join 16 17 18 C:\Python35\python.exe D:/Python0618/homework/day10/a.py 19 0 100 20 1 101
apply_async
1 from multiprocessing import Process, Pool 2 import time 3 4 def Foo(i): 5 time.sleep(3) 6 print(i,i+100) 7 return i+100 8 9 def Bar(arg): #回调函数 10 print(arg) 11 12 if __name__ == '__main__': 13 pool = Pool(5) 14 for i in range(2): 15 pool.apply_async(func= Foo,args = (i,),callback =Bar) #顺序执行,使用了join 16 pool.close() 17 pool.join() #进程池中子进程全部执行完毕后在关闭。 19 20 C:\Python35\python.exe D:/Python0618/homework/day10/a.py 21 0 100 22 1 101 23 100 24 101
app_async.get()
get()的作用是得到传递入回调函数的参数。即得到第一个func的 返回值。
from multiprocessing import Process, Pool import time def Foo(i): time.sleep(1) return i+100 def Bar(arg): #回调函数 print(arg) if __name__ == '__main__': pool = Pool(5) for i in range(2): #pool.apply_async(func= Foo,args = (i,),callback =Bar) #顺序执行,使用了join #print(type(pool.apply_async(func= Foo,args = (i,),callback =Bar))) print(pool.apply_async(func= Foo,args = (i,),callback =Bar).get()) pool.close() pool.join() C:\Python35\python.exe D:/Python0618/homework/day10/a.py 100 100 101 101
简单线程池
1 import queue 2 import time 3 import threading 4 5 class ThreadPool(object): 6 7 def __init__(self,max_num = 10): 8 9 self.queue = queue.Queue(max_num) 10 11 for i in range(max_num): 12 self.queue.put(threading.Thread) #将类名称添加到队列中 13 14 15 def get_thread(self): 16 return self.queue.get() 17 18 def add_thread(self): 19 self.queue.put(threading.Thread) 20 21 22 23 pool = ThreadPool(10) 24 25 def func(arg,p): 26 print(arg) 27 time.sleep(2) 28 p.add_thread() 29 30 31 for i in range(30): 32 thread = pool.get_thread() #得到一个线程 33 t = thread(target = func,args=(i,pool)) #在线程执行func函数,同事给线程池添加类名称 34 t.start()

浙公网安备 33010602011771号