Python:使用多处理池时使用队列写入单个文件

ris*_*sen 15 python queue pool multiprocessing

我有成千上万的文本文件,我想以各种方式解析.我想将输出保存到单个文件而不会出现同步问题.我一直在使用多处理池来节省时间,但我无法弄清楚如何组合池和队列.

以下代码将保存infile名称以及文件中连续"x"的最大数量.但是,我希望所有进程将结果保存到同一个文件,而不是像我的示例中那样保存到不同的文件.任何有关这方面的帮助将不胜感激.

import multiprocessing

with open('infilenamess.txt') as f:
    filenames = f.read().splitlines()

def mp_worker(filename):
 with open(filename, 'r') as f:
      text=f.read()
      m=re.findall("x+", text)
      count=len(max(m, key=len))
      outfile=open(filename+'_results.txt', 'a')
      outfile.write(str(filename)+'|'+str(count)+'\n')
      outfile.close()

def mp_handler():
    p = multiprocessing.Pool(32)
    p.map(mp_worker, filenames)

if __name__ == '__main__':
    mp_handler()
Run Code Online (Sandbox Code Playgroud)

tde*_*ney 32

多处理池为您实现队列.只需使用池方法将工作者返回值返回给调用者.imap效果很好:

import multiprocessing 
import re

def mp_worker(filename):
    with open(filename) as f:
        text = f.read()
    m = re.findall("x+", text)
    count = len(max(m, key=len))
    return filename, count

def mp_handler():
    p = multiprocessing.Pool(32)
    with open('infilenamess.txt') as f:
        filenames = [line for line in (l.strip() for l in f) if line]
    with open('results.txt', 'w') as f:
        for result in p.imap(mp_worker, filenames):
            # (filename, count) tuples from worker
            f.write('%s: %d\n' % result)

if __name__=='__main__':
    mp_handler()
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案/例子 (3认同)

Raj*_*Raj 7

我接受了可接受的答案,并对其进行了简化,以使我对它的工作原理有所了解。我将其张贴在这里,以防其他人使用。

import multiprocessing

def mp_worker(number):
    number += 1
    return number

def mp_handler():
    p = multiprocessing.Pool(32)
    numbers = list(range(1000))
    with open('results.txt', 'w') as f:
        for result in p.imap(mp_worker, numbers):
            f.write('%d\n' % result)

if __name__=='__main__':
    mp_handler()
Run Code Online (Sandbox Code Playgroud)