简单的进程池
进程池:
multiprocess提供了一个Pool的类来代表进程池对象。
Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核数,当有新的【请求】提交给Pool的时候,如果Pool没有满,则创建一个进程来执行该【请求】;如果Pool已经满了,则该【请求】会等待,知道进程池中有进程结束,才会创建新的进程来处理它。
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Fade Zhao' from multiprocessing import Pool import os,time def Foo(num): time.sleep(1) num += 100 print('进程ID = ',os.getpid(),num) return num def Bar(arg): print('callback function!',arg) print('callback Process ID',os.getpid()) if __name__ == "__main__": pool = Pool(processes=10) #创建进程池,最多存放5个进程 for i in range(10): # 串行执行进程 # pool.apply(func=Foo,args=(i,)) # args=(i,) 必须要有逗号 # 并行执行进程 # pool.apply_async(func=Foo,args=(i,)) # 并行执行进程且执行完成后执行回调函数(每个进程执行后) pool.apply_async(func=Foo,args=(i,),callback= Bar) print('end') pool.close() poll.join() # 进程池中进程执行完成后在关闭,如果不用join,程序直接关闭 # join()必须放在close()之后,且close() 进程池不许再添加Process了
>>>
进程ID = 7763 101
进程ID = 7764 102
进程ID = 7762 100
进程ID = 7766 104
进程ID = 7765 103
callback function! 103
callback Process ID 7761
callback function! 104
callback Process ID 7761
callback function! 102
callback Process ID 7761
callback function! 101
callback Process ID 7761
callback function! 100
callback Process ID 7761
进程ID = 7769 107
进程ID = 7770 108
进程ID = 7771 109
进程ID = 7768 106
进程ID = 7767 105
callback function! 108
callback Process ID 7761
callback function! 109
callback Process ID 7761
callback function! 107
callback Process ID 7761
callback function! 106
callback Process ID 7761
callback function! 105
callback Process ID 7761
我们会发现,输出的顺序是乱的,这个是必然的,因为都是并发执行线程,所以咱们也不确定到底哪个先执行。这个是由CPU决定的。
当一个任务结束了,新的任务依次天剑进来,任务执行使用的进程依然是原来的进程。