Я использую карту пула 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 процессов? Или есть другая проблема?