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有三个原因:
它的代码更清晰.这个:
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)有了apply_async,如果在其中发生异常post_processing_0.main,除非你明确地调用P['process_x'].get()失败的AsyncResult对象,否则你将无法知道它,这需要迭代所有的P.随着map_async例外,如果你的通话将被提出async_result.get()-无需迭代.
map_async具有内置的分块功能,如果split_list非常大,它将使您的代码表现得更好.
除此之外,如果您不关心结果,行为基本相同.
Joh*_*nck 10
apply_async向池中提交单个作业. map_async使用不同的参数提交调用相同函数的多个作业.前者采用函数加参数列表; 后者采用函数加迭代(即序列)来表示参数. map_async只能调用一元函数(即函数采用一个参数).
在您的情况下,可能最好稍微重构代码以将所有参数放在单个列表中,然后map_async使用该列表调用一次.
| 归档时间: |
|
| 查看次数: |
11759 次 |
| 最近记录: |