python multiprocessing 中imap和map的不同

本篇文章讲python的multiprocessing中
imap、map、imap_unordered和map_async方法之间的区别。

参考链接

主要有以下两个区别:

  1. 它们使用你传递给它们的可迭代的对象的方式。
  2. 它们返回结果的方式。
  • map通过将改可迭代的对象转换为列表(假设它不是列表),
    将其分解为块,并将这些块发送到池中的工作进程中。
    将该对象分解为块比一次直接执行一个对象要更好,特别是如果可迭代的对象很大。
    但是,将该对象转换为列表以便进行块化可能会产生非常高的内存成本,因为整个列表需要保存在内存中。
  • imap不会将您提供的可迭代对象变为列表,也不会将其分解为块(默认情况下)。
    它将一次遍历该对象的一个元素,并将它们分别发送到工作进程。
    这意味着您不会将整个对象转换为列表存在内存中(命中率降低),
    但这也意味着大型迭代的性能较慢,因为缺少分块。
    但是,可以通过传递大于默认值1的chunksize参数来减轻这种情况(命中率增加)。
  • 另一个主要的不同,在于imap/imap_unordered,
    你可以在工作准备就绪后立即开始接收进程的结果,而不必等待所有进程完成工作。
    使用map_async,虽然也会立即返回AsyncResult,但是在完成所有对象之前,您无法实际检索该对象的结果。
    此时它将返回映射所执行的相同列表,没有办法得到部分结果。
    在这个点上来说,它和map返回的情况相同;相当于说,你要么拥有整个结果,要么没有结果。
  • imap和imap_unordered都会立即返回结果。
    使用imap,结果将在它们准备就绪时从迭代中产生,同时仍保留输入可迭代的顺序。
    使用imap_unordered,无论输入可迭代的顺序如何,只要它们准备好就会产生结果。

所以,使用imap/imap_unordered替代map_async主要的原因有:

  1. 您的可迭代对象足够大,将其转换为列表会导致您耗尽/使用太多内存。
  2. 您希望能够在完成所有结果之前就先处理结果。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonmultiprocessing模块可以用于并行处理不同的任务。具体步骤如下: 1. 导入multiprocessing模块。 2. 创建一个进池Pool对象,指定进的进数量。 3. 使用Pool对象的map()或imap()方法,将要执行的任务以及任务所需的参数传递给它。 4. 最后,关闭进池,释放资源。 下面是一个简单的示例代码,其有两个不同的任务需要并行处理: ```python import multiprocessing def task1(arg): # 执行任务1 pass def task2(arg): # 执行任务2 pass if __name__ == '__main__': pool = multiprocessing.Pool(processes=2) # 创建进池对象,包含2个进 results = [] # 存储任务执行结果 for i in range(10): if i % 2 == 0: results.append(pool.apply_async(task1, args=(i,))) # 将任务1提交到进执行 else: results.append(pool.apply_async(task2, args=(i,))) # 将任务2提交到进执行 pool.close() # 关闭进池,不再接受新的任务 pool.join() # 等待所有任务完成 for r in results: print(r.get()) # 获取任务执行结果 ``` 在上面的示例,我们创建了一个包含2个进的进池对象,然后将10个任务交给进池处理。如果任务的编号是偶数,就执行任务1,否则执行任务2。最后,我们等待所有任务完成,并获取它们的执行结果。注意,我们使用了apply_async()方法来提交任务,这个方法是异步的,会立即返回一个AsyncResult对象,可以通过它来获取任务的执行结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值