diff --git a/module10/hw5/linear.png b/module10/hw5/linear.png new file mode 100644 index 0000000..69d4668 Binary files /dev/null and b/module10/hw5/linear.png differ diff --git a/module10/hw5/module_10_5.py b/module10/hw5/module_10_5.py new file mode 100644 index 0000000..b4f33dd --- /dev/null +++ b/module10/hw5/module_10_5.py @@ -0,0 +1,68 @@ +# Домашнее задание по теме "Многопроцессное программирование" +""" +Задача "Многопроцессное считывание": + +Необходимо считать информацию из нескольких файлов одновременно, используя многопроцессный подход. + +Подготовка: + +Скачайте архив с файлами для считывания данных и распакуйте его в проект для дальнейшего использования. + +Выполнение: + +Создайте функцию read_info(name), где name - название файла. Функция должна: + 1. Создавать локальный список all_data. + 2. Открывать файл name для чтения. + 3. Считывать информацию построчно (readline), пока считанная строка не окажется пустой. + 4. Во время считывания добавлять каждую строку в список all_data. + +Этих операций достаточно, чтобы рассмотреть преимущество многопроцессного выполнения программы над линейным. + 1. Создайте список названий файлов в соответствии с названиями файлов архива. + 2. Вызовите функцию read_info для каждого файла по очереди (линейно) + и измерьте время выполнения и выведите его в консоль. + 3. Вызовите функцию read_info для каждого файла, + используя многопроцессный подход: контекстный менеджер with и объект Pool. + Для вызова функции используйте метод map, передав в него функцию read_info и список названий файлов. + Измерьте время выполнения и выведите его в консоль. + +Для избежания некорректного вывода запускайте линейный вызов и многопроцессный по отдельности, +предварительно закомментировав другой. +""" +import time +from multiprocessing import Pool + + +def read_info(name): + all_data = [] + with open(name, 'r') as file: + while True: + line = file.readline() + if not line: + break + all_data.append(line) + return print("============================\n" + f"\tfile {name} read\n" + "============================") + + +# пример использования +# p.s. файлы слишком большие для гит репозитория +if __name__ == "__main__": + # список файлов для чтения + file_names = [f"file {number}.txt" for number in range(1, 5)] + + # линейный вызов + start_time = time.time() + for file_name in file_names: + read_info(file_name) + linear_duration = time.time() - start_time + print(f"Время выполнения линейного вызова: {linear_duration:.6f} секунд") + + # закомментить блок выше для многопроцессного выполнения и раскомментить блок ниже + + # многопроцессный вызов функции + # start_time = time.time() + # with Pool() as pool: + # pool.map(read_info, file_names) + # parallel_duration = time.time() - start_time + # print(f"Время выполнения многопроцессного вызова: {parallel_duration:.6f} секунд") diff --git a/module10/hw5/parallel.png b/module10/hw5/parallel.png new file mode 100644 index 0000000..05ffa4d Binary files /dev/null and b/module10/hw5/parallel.png differ