복붙노트

[PYTHON] 파이썬 : 다중 처리 풀을 사용하는 동안 큐가있는 단일 파일에 쓰기

PYTHON

파이썬 : 다중 처리 풀을 사용하는 동안 큐가있는 단일 파일에 쓰기

여러 가지 방법으로 구문 분석하려는 수십만 개의 텍스트 파일이 있습니다. 동기화 문제없이 출력을 단일 파일로 저장하려고합니다. 시간을 절약하기 위해 다중 처리 풀을 사용했지만 Pool과 Queue를 결합하는 방법을 알 수 없습니다.

다음 코드는 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()

해결법

  1. ==============================

    1.다중 처리 풀은 사용자를 위해 대기열을 구현합니다. 호출자에게 작업자 반환 값을 반환하는 풀 메서드 만 사용하면됩니다. imap은 잘 작동합니다.

    다중 처리 풀은 사용자를 위해 대기열을 구현합니다. 호출자에게 작업자 반환 값을 반환하는 풀 메서드 만 사용하면됩니다. 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()
    
  2. ==============================

    2.나는 받아 들여진 대답을 취해 이것이 어떻게 작동하는지 내 자신의 이해를 위해 단순화했다. 다른 사람에게 도움이 될 수 있도록 여기에 게시하고 있습니다.

    나는 받아 들여진 대답을 취해 이것이 어떻게 작동하는지 내 자신의 이해를 위해 단순화했다. 다른 사람에게 도움이 될 수 있도록 여기에 게시하고 있습니다.

    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()
    
  3. from https://stackoverflow.com/questions/26596714/python-writing-to-a-single-file-with-queue-while-using-multiprocessing-pool by cc-by-sa and MIT license