进程池写入的输出文件在任意位置被切断?

2024-04-19 21:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用multiprocessing.pool的进程来处理一个大文件,这些进程都在写入一个输出文件。我将输入文件划分为分区(本质上是2个行索引元组,我稍后将其传递给linecache.getline()),并使用pool.map(func, list_of_partitions)。在func内部,当前进程在其给定的分区上工作(保证不会与任何其他分区重叠),然后在将结果写入单个输出文件之前,它获取一个锁,然后在写入完成后释放它。锁是使用初始值设定项创建的,因此它是继承的(取自this answer),以便在进程之间共享。以下是相关代码:

l = multiprocessing.Lock() # lock
o = open("filename", 'w') # output
pool = multiprocessing.Pool(num_cores, initializer=init, initargs=(l, o,))

其中init定义如下:

def init(l, o):
    global lock, output
    lock = l
    output = o

我的问题是输出文件在随机位置丢失了一些文本。一开始,我发现输出文件的结尾被切断了,但我在文件结尾添加了许多空行并发现文件中间的另一块文本也缺少部分时,我确认这不是文件结尾的专有内容。以下是预期文本块的示例:

Pairs: [(81266, 146942, 5)]
Number of pairs: 1
idx1 range: [81266, 81266]
idx2 range: [146942, 146942]
Most similar pair: (81266, 146942, 5)
Total similarity (mass): 5

这里有一个街区被切断了:

Pairs: [(81267, 200604, 5)]
Number of pairs: 1
idx1 range: [81267, 81267]
idx2 range: [200604, 200604]
Most similar pair: (81267, 200604, 5)
Total similarity (ma

另一个更严重的情况是:

Pairs: [(359543, 366898, 5), (359544, 366898, 5), (359544, 366899, 6)]
Number of pairs: 3

值得一提的是,我正在做pool.close()然后pool.join(),尽管当我删除它们时问题仍然存在。你知道吗

你能想到会导致这种情况的原因吗?当我在没有并行性的情况下正常运行代码时,问题不会出现。在给定相同的输入文件的情况下,我比较了由并行版本生成的文件和非并行版本生成的文件中有效的、完整输出的文本块的数量(如我上面给出的示例),发现并行版本有137073个有效块,而非并行版本有137114个有效块,因此我丢失了41个有效块(即41个不同的区块被切断),这是一个非常小的数字相比,总的区块数,所以这是真的让我困惑。如有任何意见或建议,我们将不胜感激!你知道吗


Tags: 文件of文本版本lockoutput进程init