Добавить в корзинуПозвонить
Найти в Дзене
Computer Pro

Мультипоточность. Часть2. Домашнее задание

Итак, продолжаем разговор про мультипоточность, мультироцессорность и другие непростые, для понимания, темы. Перепишите задачу 2 из предыдущего модуля с использованием объекта типа Pool из модуля multiprocessing. Напомним условие: скачайте 20 персонажей из базы данных о «Звёздных войнах» и сохраните их имена, возраст и пол в БД. Оформите решение в виде двух функций: с использованием Pool и ThreadPool. Замерьте время работы каждой из них и сравните результаты. Начал с того, что закоментировал тот код который отвечает за создание ссылок на получение json-ответа о герое саги о звёздных войнах. Сейчас мы этот код будем переделывать но уже с применением Pool и ThreadPool. А пока создаю две функции load_heroes_pool() и load_heroes_threadpool() Практически полностью переработал прошлый код "героев звёздных войн", всё сделал иначе и вот что из этого получилось: Тут всё довольно таки понятно, но если нужна будет "пояснительная бригада", обращайтесь в комменты, я помогу растолковать что же ту у
Оглавление

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

Задача 1. «Звёздные войны 2»

Перепишите задачу 2 из предыдущего модуля с использованием объекта типа Pool из модуля multiprocessing. Напомним условие: скачайте 20 персонажей из базы данных о «Звёздных войнах» и сохраните их имена, возраст и пол в БД. Оформите решение в виде двух функций: с использованием Pool и ThreadPool. Замерьте время работы каждой из них и сравните результаты.

Начал с того, что закоментировал тот код который отвечает за создание ссылок на получение json-ответа о герое саги о звёздных войнах. Сейчас мы этот код будем переделывать но уже с применением Pool и ThreadPool.

Когда этот код станет мне совсем не нужен - я его вообще удалю...
Когда этот код станет мне совсем не нужен - я его вообще удалю...

А пока создаю две функции load_heroes_pool() и load_heroes_threadpool()

осталось дело за малым - наполнить эти функции строками кода...
осталось дело за малым - наполнить эти функции строками кода...

Практически полностью переработал прошлый код "героев звёздных войн", всё сделал иначе и вот что из этого получилось:

-4
-5
-6

Тут всё довольно таки понятно, но если нужна будет "пояснительная бригада", обращайтесь в комменты, я помогу растолковать что же ту у меня написано... А пока движемся дальше...

Задача 2. Анализ процессов

Реализуйте две функции:

-7

  • Для решения вам пригодятся флаги -u, -o и --ppid команды ps.
  • Используйте максимум возможностей терминальных команд и минимум вычислений в самой программе. Это сильно повысит производительность. Для подсчёта строк подходит команда wc.

Не уверен в правильности решения задачи со второй функцией, но вроде бы всё получилось. Как-то так:

-8

И даже работает без ошибок...

-9

ОК. Идем дальше...

Задача 3. Прерывание программы

Внесите изменения в следующую программу так, чтобы её можно было прервать с помощью Ctrl+C, корректно завершив потоки t1 и t2:

-10

Что оценивается

  • Функции fun1() и fun2() не претерпели изменений.
  • При нажатии Ctrl+C программа завершает работу потоков.

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

и попробовал остановить нажатием Ctrl+C, останавливается. Тогда в чем же задача?!
и попробовал остановить нажатием Ctrl+C, останавливается. Тогда в чем же задача?!

Я кажется понял, при Ctrl+C должно появляться сообщение что сработало зарезервированное клавиатурное прерывание, см. скриншот ниже... А вверху сработало исключение и ошибка. Вроде бы я так понял...

-12

Достигается это написанием вот такого кода:

-13

Посчитаю что задача решена. И двигаюсь дальше!

Задача 4. Сортировка логов

Одна из классических проблем при работе с многопоточными и многопроцессорными программами — организация записи в файл.

Реализуйте следующую программу:

  • с интервалом в одну секунду запускаются последовательно десять потоков;
  • каждый поток работает 20 секунд;
  • каждый поток должен один раз в секунду писать лог в файл в формате <timestamp> <дата>.

Получите дату с http://127.0.0.1:8080/timestamp/1549892280, запустив перед этим server.py. Вместо 1549892280 подставьте текущий timestamp. Логи должны быть отсортированы по timestamp.

Смысл данной работы таков: server.py запускает flask-сервер, который конвертирует штамп даты (timestamp) в читаемое значение типа 2024-02-29 08:38:12.238779 и нам нужно создать второй файл, запустив который мы сгенерируем лог типа:

-14

Чтобы такой лог получился нужно написать вот такую программку:

-15

В условиях к задаче написано "Логи должны быть отсортированы по timestamp" что меня сильно смутило, ведь у меня итак все логи идут по порядку, по времени. Зачем их еще сортировать?! Может просто есть реализации данной программы таким образом что логи по времени идут в разнобой?! Возможно...

Ну вот как-то так...

-16

Кто-то может написать - мол то или другое у тебя не верно, всё возможно, но так как задание куратором принято - я считаю что верно. А если хотите возразить - покажите скриншот вашего, правильного, кода в комментариях!