Многопроцессорная обработка только с первой строкой кода - PullRequest
1 голос
/ 05 октября 2019

Привет У меня возникли проблемы с попыткой заставить работать мультипроцессор. Поэтому после вызова apply_async он выполняет только первую строку функции и ничего больше. Любая помощь будет принята с благодарностью. Спасибо!

tp = ThreadPool(processes=4)

for file in listdir(alignDir):
    tp.apply_async(trim, (file,))
    sleep(0.5)

tp.close()
tp.join()
def trim(file):
    print("Trimming " + file)
    input_file = alignDir + file    
    print(input_file)

Я получаю следующие результаты

Start Trimming.
Trimming Africa_HA_merged_aligned.fasta
Trimming Africa_MP_merged_aligned.fasta
Trimming Africa_NA_merged_aligned.fasta
Trimming Africa_NP_merged_aligned.fasta
Trimming Africa_NS_merged_aligned.fasta
Trimming Africa_PA_merged_aligned.fasta
.
.
.
all the way to the end and nothing was actually done

вместо

Start Trimming.
Trimming Africa_HA_merged_aligned.fasta
someinputfile string
Trimming Africa_MP_merged_aligned.fasta
anotherinputfile string
Trimming Africa_NA_merged_aligned.fasta
anotherinputfile string
.
.
.
and so on

1 Ответ

0 голосов
/ 05 октября 2019

Вероятно, что trim генерирует исключение, но исключить его некуда, поэтому оно сбрасывается. Сценарий запрашивает выполнение ряда действий в фоновом режиме, используя apply_async, но никогда не запрашивает результаты (например, get), поэтому эти результаты, включая возможные исключения, никогда нигде не получаются.

Один из способов исправить это - заменить этот цикл:

for file in listdir(alignDir):
    tp.apply_async(trim, (file,))

чем-то вроде map метода, который "... разбивает итерируемое на несколько частей, которые он отправляетв пул процессов как отдельные задачи ... "и, что особенно важно," блокирует, пока результат не будет готов "( docs ), что-то вроде:

tp.map(trim, listdir(alignDir))

Размер этих кусковнастраивается;Ваш существующий цикл будет эквивалентен размеру куска 1.

Поскольку скрипт теперь ожидает результатов, он замечает, что вместо результатов есть исключение, и это исключение распространяется и регистрируется как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...