Я должен обработать около 45 000 элементов, это займет около 4 часов на одном ядре.
хочу
- индикатор выполнения, чтобы проверить, идет ли процесс вперед
- чтобы регистрировать ошибки во время работы процесса, чтобы в конечном итоге остановить его, если я замечу, что он идет недостаточно хорошо.
Лучшее, с чем я пришел, - это отображение индикатора выполнения, но печать журналов только в самом конце процесса. Это требует, чтобы моя функция возвращала строку (строку журнала) и печатала возвращенную строку после получения всех результатов. Настоящая работа создает файлы.
Я понял, что все строки журнала я получаю в самом конце процесса, потому что я строю список результатов (таким образом, заканчивая процесс), прежде чем перебирать строки журнала. Но так как я не привык к многопоточности, я не вижу, как достичь того, к чему стремлюсь.
from multiprocessing import Pool
from tqdm import tqdm
def thread_safe_function(arg):
# do things
return log_line
if __name__ == '__main__':
for log in list(tqdm(pool.imap(thread_safe_function, input_list), total=len(pronunciation_models))):
print log
Полагаю, правильным решением было бы заставить мою основную функцию печатать журналы, но мне не повезло, попробовав это. Я считаю, что либо потоки, созданные моей программой, не делят стандартный вывод с родительским процессом (таким образом, печатая журналы где-то, что я не смогу прочитать), либо я неправильно использовал блокировку из многопроцессорной обработки.
def thread_safe_function(lock, arg):
# do things
if error:
lock.acquire()
print error
lock.release()