进程池Pool

>>进程池Pool

Pool类
   Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,
  才会创建新的进程来执行这些请求。 
  下面介绍一下multiprocessing 模块下的Pool类下的几个方法:
  1、apply()
    函数原型:apply(func[, args=()[, kwds={}]])
    该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不在出现)。
  2、apply_async
    函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])
    与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。
  3、map()
     函数原型:map(func, iterable[, chunksize=None])
    Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回。 
    注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。
  4、map_async()
    函数原型:map_async(func, iterable[, chunksize[, callback]])
    与map用法一致,但是它是非阻塞的。其有关事项见apply_async。
  5、close()
    关闭进程池(pool),使其不在接受新的任务。
  6、terminal()
    结束工作进程,不在处理未处理的任务。
  7、join()
    主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。
# 进程池 mulprocessing.Pool类
import multiprocessing
import time
from multiprocessing import pool

def work():
    print('this time is %s'% time.ctime())
    print(('Process pid is {}____Procrss name is {}').format(multiprocessing.current_process().pid,
          multiprocessing.current_process().name))
    time.sleep(1)

def main():
    Pool=multiprocessing.Pool(processes=3) #定义三个大小相同的进程池
    for i in range(10):
        Process=Pool.apply_async(func=work)   # 采用非阻塞的形式执行进程   也就是异步执行
        Process.get()           # 获取进程返回结果
    Pool.close()    # 执行完毕关闭进程池
    Pool.join()    # 等待程序执行完成

if __name__ == '__main__':
    main()
posted @ 2022-04-12 00:10  饭兜  阅读(84)  评论(0编辑  收藏  举报