Использование Python Карта пула для записи вывода в разные файлы - PullRequest
0 голосов
/ 24 февраля 2020

Я использую карту пула Python для обработки различных входных файлов (используя pyahocorasick для вывода строк, содержащих шаблоны в автомате tr ie), а затем записываю результаты в разные выходные файлы. Тем не менее, кажется, что скрипт зависает после завершения одного входного файла (и результаты записываются).

Мой код выглядит следующим образом.

def write_output(csv_file):
    with open(COMMON_FILE, "r") as fin_common:
        for common in fin_common:
            common = common.strip()
            a.add_word(common, common)
    a.make_automaton()

    com_filename = os.path.basename(csv_file)
    out_com_file = COMMON_CSV_PATH + "ext_" + com_filename
    fout = open(out_com_file, "w")

    num_line = 0
    total_lines = subprocess.check_output("cat %s | wc -l" % (CSV_PATH + csv_file), shell=True).split("\n")[0:-1]

    with open(CSV_PATH + csv_file, "r") as fin:
        for line in fin:
            num_line += 1
            if num_line % 50000 == 0:
                print "\tFile: %s\tLine %s/%s" % (com_filename, num_line, total_lines[0])

            matches = a.iter(line)
            m = next(matches, None)
            if m is not None:           
                fout.write("%s" % line)

    fout.close()

Часть, которая вызывает функцию write_output для обрабатывать каждый входной CSV-файл:

p = Pool(4) 
p.map(write_output, os.listdir(CSV_PATH))

. Выходные данные, которые я вижу в конце при зависании, равны

File: 20190101.csv  Line 5950000/7627309
File: 20190103.csv  Line 5900000/7584127
File: 20190101.csv  Line 6000000/7627309
File: 20190103.csv  Line 5950000/7584127
File: 20190101.csv  Line 6050000/7627309
File: 20190103.csv  Line 6000000/7584127
File: 20190101.csv  Line 6100000/7627309
File: 20190103.csv  Line 6050000/7584127
File: 20190103.csv  Line 6100000/7584127
File: 20190103.csv  Line 6150000/7584127
...
File: 20190103.csv  Line 7500000/7584127
File: 20190103.csv  Line 7550000/7584127

Каждый процесс обработал бы каждый CSV-файл и затем создал бы (отдельный ) новый выходной файл. Как видите, файл 20190103.csv, похоже, завершил обработку, но не 20190101.csv. Но сценарий просто висит там и больше ничего не делает. Заполняется только выходной файл для 20190103.csv, остальные 2 выходных файла для 20190101.csv и 20190102.csv пусты.

Кроме того, когда я распечатываю fout, я получаю

<open file '/home/user/Documents/ext_20190101.csv', mode 'w' at 0x7ff10a0c0ae0>
<open file '/home/user/Documents/ext_20190102.csv', mode 'w' at 0x7ff10a0c0ae0>
<open file '/home/user/Documents/ext_20190103.csv', mode 'w' at 0x7ff10a0c0ae0>

"at 0x ..." одинаковы. Означает ли это, что файловый дескриптор одинаков для всех 3 процессов / файлов?

Существует ли проблема с использованием одинакового дескриптора файла fout для всех 3 процессов? Или есть другая проблема?

...