Python: zapis do pojedynczego pliku z kolejką podczas korzystania z puli wieloprocesorowej

Mam setki tysięcy plików tekstowych, które chcę analizować na różne sposoby. Chcę zapisać wyjście do pojedynczego pliku bez problemów z synchronizacją. Używam multiprocessing pool, aby to zrobić, aby zaoszczędzić czas, ale nie mogę dowiedzieć się, jak połączyć pulę i kolejkę.

Poniższy kod zapisze nazwę pliku, jak również maksymalną liczbę kolejnych " x " w pliku. Chcę jednak, aby wszystkie procesy zapisywały wyniki do tego samego pliku, a nie do różnych pliki jak w moim przykładzie. Każda pomoc w tym zakresie będzie bardzo mile widziana.

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()
Author: risraelsen, 2014-10-27

2 answers

Pule wieloprocesorowe implementują kolejkę dla Ciebie. Wystarczy użyć metody pool, która zwraca wartość zwracaną worker do wywołującego. imap działa dobrze:

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()
 23
Author: tdelaney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-27 23:15:59

Przyjęłam zaakceptowaną odpowiedź i uprościłam ją dla własnego zrozumienia, jak to działa. Umieszczam go tutaj, na wypadek, gdyby pomógł komuś innemu.

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
Author: Raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-18 02:03:37