Pool实现多进程并行

  • Pool 模块来自于 multiprocessing 模块。

multiprocessing 模块是跨平台版本的多进程模块,像线程一样管理进程,与 threading 很相似,对多核CPU的利用率会比 threading 好的多。Pool 类可以提供指定数量的进程供用户调用,当有新的请求提交到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之后使用。

  • code—view

import os
from multiprocessing import Pool

def process_multi(targetDir, resultDir):
    files = os.listdir(targetDir)
    pool = Pool(processes=10)
    for fileName in files:
        if not fileName.startswith('x'):
            continue
        targetFile = os.path.join(targetDir, fileName)
        resultFile = os.path.join(resultDir, fileName)
        pool.apply_async(process, (targetFile, resultFile))
    pool.close()
    pool.join()

备注

1、阻塞与非阻塞的区别:

  • map() 会使进程阻塞,即通过 map() 开启的多进程都结束之后,这个函数才会有返回结果,否则主进程会一直等待,不会往下进行。
  • map_async() 为非阻塞,即通过 map_async() 开启多进程之后,立刻会返回结果,主进程会继续往下执行。

注意:如果后面调用了 join() 函数,则不管之前用的是 map 还是 map_async,主进程都会等待,直到进程池中所有进程执行完毕,才会继续往下执行。
 

你可能感兴趣的:(python)