【问题标题】:map_async vs apply_async:what should I use in this casemap_async vs apply_async:在这种情况下我应该使用什么
【发布时间】:2015-02-13 06:20:20
【问题描述】:

我正在处理一些 ascii 数据,进行一些操作,然后将所有内容写回另一个文件(工作由 post_processing_0.main 完成,不返回任何内容)。我想用多处理模块并行化代码,见下面代码sn-p:

from multiprocessing import Pool
import post_processing_0

def chunks(lst,n):
    return [ lst[i::n] for i in xrange(n) ]

def main():
    pool = Pool(processes=proc_num)
    P={}
    for i in range(0,proc_num):
        P['process_'+str(i)]=pool.apply_async(post_processing_0.main, [split_list[i]])
    pool.close()
    pool.join()


proc_num=8
timesteps=100
list_to_do=range(0,timesteps)
split_list=chunks(list_to_do,proc_num)

main()

我阅读了map和async之间的区别,但我不是很理解。我对多处理模块的应用是否正确?

在这种情况下,我应该使用 map_async 还是 apply_async?为什么?

编辑:

我不认为这是问题Python multiprocessing.Pool: when to use apply, apply_async or map? 的重复。在问题中,答案集中在使用这两个函数可以获得的结果的顺序上。这里我问:什么都不返回有什么区别?

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

apply_async 将单个作业提交到池中。 map_async 提交多个作业,使用不同的参数调用相同的函数。前者采用函数加参数列表;后者采用一个函数加上表示参数的可迭代(即序列)。 map_async 只能调用一元函数(即带一个参数的函数)。

在您的情况下,最好稍微重构代码以将所有参数放在一个列表中,然后使用该列表调用一次map_async

【讨论】:

  • 那么如果我们考虑 4 个进程和 16 个文件进行后处理,map 将“创建”16 个同时运行的实例?
  • 您的意思是池的大小为 4,而参数列表的大小为 16?在这种情况下,一次只能运行 4 个;当第一个完成时,第五个将开始,等等。
  • 好的!然后我明白没有区别(除了修改代码)。对吗?
  • 我说我的回答有什么不同。例如,map_async 只能调用一元函数。
  • 虽然我在 SO 上读到的其他答案仍然给我留下了疑问,但这个答案以非常简洁的方式阐明了“apply_async”和“map_async”之间的区别。谢谢!
【解决方案2】:

我推荐map_async 有三个原因:

  1. 看起来更简洁的代码。这个:

    pool = Pool(processes=proc_num)
    async_result = pool.map_async(post_processing_0.main, split_list)
    pool.close()
    pool.join()
    

    看起来比这个更好:

    pool = Pool(processes=proc_num)
    P={}
    for i in range(0,proc_num):
        P['process_'+str(i)]=pool.apply_async(post_processing_0.main, [split_list[i]])
    pool.close()
    pool.join()
    
  2. 1234563 P。对于 map_async,如果您调用 async_result.get(),则会引发异常 - 不需要迭代。
  3. map_async 具有内置的分块功能,如果split_list 非常大,这将使您的代码性能明显更好。

除此之外,如果你不关心结果,行为基本相同。

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2012-12-18
    相关资源
    最近更新 更多