进程池就是维持一定量的进程,当有任务时调用进程处理,没有任务时进程空闲,当任务过多时就会等有空闲进程后再进行处理。
进程池有几个函数
apply() 执行一个任务,会阻塞当前进程
apply_async() 执行一个任务,不会阻塞当前进程
apply会返回执行函数的结果,但是apply_async不会等待结果而是直接返回一个multiprocessing.pool.ApplyResult object,因为apply阻塞了进程,等子进程运行完后才继续,所以可以拿到结果,而apply_async不阻塞当前进程,直接输出结果就会输出一个multiprocessing.pool.ApplyResult object
例如:
apply
apply_async
map() 并行地执行一个map,会阻塞当前进程
map_async() 并行地执行一个map,不会阻塞当前进程
map和python内置的map差不多,但是这里是并行执行(会占用所有空闲进程去实现函数)。
map
map_async
close() 关闭进程池,不接受新任务,当所有进程的任务都完成后关闭
terminate() 无论任务是否完成,立刻关闭
join() 等待进程池中进程完成,会阻塞当前进程
进程池中共享对象,之前提到进程之间用队列实现共享可以用到multiprocessing.Queue,但是进程池中进程共享队列必须是multiprocessing.Manager.Queue