Python 中使用 multiprocessing 处理大文件:如何确保每个进程只加载资源一次?

3

Python的multiprocessing.Pool.imap非常方便,可以逐行处理大型文件:

import multiprocessing

def process(line):
    processor = Processor('some-big.model') # this takes time to load...
    return processor.process(line)

if __name__ == '__main__':
    pool = multiprocessing.Pool(4)
    with open('lines.txt') as infile, open('processed-lines.txt', 'w') as outfile:
        for processed_line in pool.imap(process, infile):
            outfile.write(processed_line)

如何确保像上面示例中的Processor这样的帮助程序仅加载一次?是否有可能在不使用涉及队列的更复杂/冗长结构的情况下实现?


1
这是可能的,这就是 Pool 参数initializer 的用途(示例)。 - Darkonaut
感谢提示,@Darkonaut!与此同时,我也在Stackoverflow上找到了两篇相关的帖子(https://dev59.com/I2kw5IYBdhLWcg3wHnB_?answertab=votes#tab-top和https://dev59.com/z1kT5IYBdhLWcg3wStvQ?answertab=votes#tab-top),但我已经在这个问题上浪费了数小时的时间... - sam
1个回答

2

multiprocessing.Pool允许通过initializerinitarg参数进行资源初始化。令人惊讶的是,这个想法是利用全局变量,如下所示:

最初的回答:

import multiprocessing as mp

def init_process(model):
    global processor
    processor = Processor(model) # this takes time to load...

def process(line):
    return processor.process(line) # via global variable `processor` defined in `init_process`

if __name__ == '__main__':
    pool = mp.Pool(4, initializer=init_process, initargs=['some-big.model'])
    with open('lines.txt') as infile, open('processed-lines.txt', 'w') as outfile:
        for processed_line in pool.imap(process, infile):
            outfile.write(processed_line)

这个概念在multiprocessing.Pool的文档中没有很好地描述,因此我希望这个例子对其他人有所帮助。将Original Answer翻译成"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接