map_async vs apply_async:在这种情况下我应该使用什么

Pie*_*olo 11 python multiprocessing

我正在处理一些ascii-data,进行一些操作,然后将所有内容写回另一个文件(完成的工作post_processing_0.main,不返回任何内容).我想将代码与多处理模块并行化,请参阅以下代码片段:

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()
Run Code Online (Sandbox Code Playgroud)

我读了地图和异步之间的区别,但我不太了解它.我的多处理模块的应用是否正确?

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

编辑:

我不认为这是Python multiprocessing.Pool问题的重复:何时使用apply,apply_async或map?.在问题中,答案集中在使用这两个函数可以获得的结果的顺序.我在这里问:没有任何东西返回时有什么区别?

dan*_*ano 12

我建议map_async有三个原因:

  1. 它的代码更清晰.这个:

    pool = Pool(processes=proc_num)
    async_result = pool.map_async(post_processing_0.main, split_list)
    pool.close()
    pool.join()
    
    Run Code Online (Sandbox Code Playgroud)

    看起来比这更好:

    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()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 有了apply_async,如果在其中发生异常post_processing_0.main,除非你明确地调用P['process_x'].get()失败的AsyncResult对象,否则你将无法知道它,这需要迭代所有的P.随着map_async例外,如果你的通话将被提出async_result.get()-无需迭代.

  3. map_async具有内置的分块功能,如果split_list非常大,它将使您的代码表现得更好.

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


Joh*_*nck 10

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

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

  • 您的意思是池的大小为 4,参数列表的大小为 16?在这种情况下,一次只会运行 4 个;当第一个完成时,第五个将开始,依此类推。 (2认同)