многопоточность: индикатор выполнения и ведение журнала в реальном времени - PullRequest
0 голосов
/ 09 ноября 2018

Я должен обработать около 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...