繁体   English   中英

multiprocessing.Pool 不在可迭代的最后一个元素上运行

[英]multiprocessing.Pool not running on last element of iterable

我正在尝试运行一个函数func ,它接受索引列表作为参数并处理数据。

def func(rng):
    **some processing**
    write_csv_to_disk(processed_data[rng],mode="a")


import multiprocessing
pool = multiprocessing.Pool(4)
pool.map(func,list_of_lists_of_indices)
pool.close()

该函数以append模式append并行处理的部分DataFrame[indices]保存到文件中。 除了最后一个列表之外,该代码对于list_of_lists_of_indices所有子列表都运行良好。 针对最后一个列表中索引的数据未保存到我的文件中,并且池已关闭。

list_of_lists_of_indices = [[0,1,2,3,4,.....,99999],[100000,100001,100002,100003,100004,......,199999],.....,[10000000,10000001,...,100000895]]
import multiprocessing
pool = multiprocessing.Pool(4)
pool.map(func,iterable = list_of_lists_of_indices)
pool.close()

好吧,您不是在说write_csv_to_disk作用,但这里似乎存在一些可能的问题:

  1. 您有多个进程同时写入同一个文件,除非您采取特定步骤(例如锁定文件)以避免它们相互覆盖,否则这真的不会顺利
  2. 您正在解释的症状看起来很像您没有正确关闭文件对象,依靠垃圾收集器来执行此操作并关闭缓冲区,除非在最后一次迭代中,例如工作人员可能在 GC 运行之前死亡,因此文件不会关闭,其缓冲区不会刷新到磁盘
  3. 此外,虽然Pool.map结果是有序的(费用很高),但不能保证它们将按什么顺序执行 由于是工作人员在写入磁盘,因此没有理由订购这些。 我什至不明白你为什么要使用mapmap的全部目的是返回计算结果,你在这里没有做

    您不应该使用 Pool.map,也不应该“以追加模式保存到文件”。

另请注意, Pool.close意味着您不会向池提供新工作,它不会等待工作人员完成 现在理论上,如果您只使用同步方法,那应该无关紧要,但是在这种情况下并给出 (2) 这可能是一个问题:当父进程退出时,池可能会被垃圾收集,这意味着会被硬关闭游泳池工人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM