美文网首页
进程池Pool的imap方法解析

进程池Pool的imap方法解析

作者: 平仄_pingze | 来源:发表于2018-05-23 20:38 被阅读87次

    Python中,multiprocessing库中Pool类代表进程池,其对象有imap()和imap_unordered()方法。
    两者都用于对大量数据遍历多进程计算,返回一个迭代器(multiprocessing.pool.IMapIterator)。

    imap返回结果顺序和输入相同,imap_unordered则为不保证顺序。

    经过测试,发现Python多进程和imap()的一些特性:

    1、iter = pool.imap(fn, data) 一旦生成,无论使不使用iter,多进程计算都会开始。
    计算结果会缓存在内存中,所以要注意内存用尽的问题。

    2、fn,即执行函数,不可以是局部对象(不能嵌套在其他函数里),否则会报错:

    def fn_outer():
        def fn(a,b):
            return a+b
        pool = Pool()
        pool.imap(fn, [(1,2)])
        pool.close()
    

    AttributeError: Can't pickle local object 'fn_outer.<locals>.fn'

    3、使用进程池map数据时,如果每次的运算量很小,最后的效率还不如单进程。这时多进程切换造成的开销已大于多进程计算提升的效率。
    这时,可以将输入数据集分段,每次map,计算一段。具体分段多大时获得最佳效率,需要实际测试。

    4、注意,Pool使用完毕后必须关闭,否则进程不会退出。
    有两种写法,推荐第2种:
    注意,第二种中,必须在with的块内使用iter。

    pool = Pool()
    iter = pool.imap(func, iter)
    for ret in iter:
        # do something
    pool.close()
    
    with Pool() as pool:
        iter = pool.imap(func, iter)
        for ret in iter:
            # do something
    

    相关文章

      网友评论

          本文标题:进程池Pool的imap方法解析

          本文链接:https://www.haomeiwen.com/subject/xssdjftx.html