Параллельная программа на Python не производит вывод - PullRequest
0 голосов
/ 04 февраля 2019

У меня простая задача.Определенная функция должна быть запущена для большого количества файлов.Эта задача может быть легко распараллелена.

Вот рабочий код:

# filelist is the directory containing two file, a.txt and b.txt.
# a.txt is the first file, b.xt is the second file
# I pass a file that lits the names of the two files to the main program

from concurrent.futures import ProcessPoolExecutor, as_completed
from pathlib import Path
import sys

def translate(filename):
    print(filename)
    f = open(filename, "r")
    g = open(filename + ".x", , "w")
    for line in f:
        g.write(line)

def main(path_to_file_with_list):
    futures = []
    with ProcessPoolExecutor(max_workers=8) as executor:
        for filename in Path(path_to_file_with_list).open():
            executor.submit(translate, "filelist/" + filename)
        for future in as_completed(futures):
            future.result()

if __name__ == "__main__":
     main(sys.argv[1])

Однако, новые файлы не создаются, т.е. папка не содержит a.txt.x иb.txt.x файлы.

Что не так с приведенным выше кодом и как я могу заставить его работать?

Спасибо.

1 Ответ

0 голосов
/ 04 февраля 2019

Это должно привести вас на правильный путь.Если это не работает и не является очевидной ошибкой, то я подозреваю, что у вас не все пути к файлам правильные ... Я должен отметить, что написание файлов выиграет больше от потоков, чем от процессов с уменьшенными накладными расходами.Файловый ввод / вывод должен освобождать GIL, так что вы получите выгоду от ускорения (значительно больше, если вы копируете более одной строки за раз.) При этом, если вы просто копируете файлы, вам действительно нужно просто использовать shutil.copyили shutil.copy2

from concurrent.futures import ProcessPoolExecutor, wait
from pathlib import Path
import sys

def translate(filename):
    print(filename)
    with open(filename, "r") as f, open(filename + ".x", , "w") as g:
        for line in f:
            g.write(line)

def main(path_to_file_with_list):
    futures = []
    with ProcessPoolExecutor(max_workers=8) as executor:
        for filename in Path(path_to_file_with_list).open():
            futures.append(executor.submit(translate, "filelist/" + filename))
        wait(futures) #simplify waiting on processes if you don't need the result.
        for future in futures:
            if future.excpetion() is not None:
                raise future.exception() #ProcessPoolEcecutors swallow exceptions without telling you...
        print("done")

if __name__ == "__main__":
     main(sys.argv[1])
...