Найти в Дзене
Computer Pro

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

Оглавление

Задача 1. Философы

Пять философов сидят вокруг круглого стола, перед каждым философом стоит тарелка спагетти. Вилки лежат на столе между каждой парой ближайших философов.

Каждый философ может либо есть, либо размышлять. Однако философ может есть только тогда, когда держит две вилки — взятую справа и слева.

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

Нашел какую-то схему алгоритма решения этой задачи. Стало ли мне понятней?! Нет, не стало... Но под конец, всё же забрезжил свет в конце мыслительного туннеля...
Нашел какую-то схему алгоритма решения этой задачи. Стало ли мне понятней?! Нет, не стало... Но под конец, всё же забрезжил свет в конце мыслительного туннеля...

В лекциях, в задаче про философов, вместо имен философов использованы имена типа "Thread1", зачем так сделано - не понятно. Ведь задача у нас про философов вот пусть они то там и фигурируют. И вот что из всего этого безобразия получилось. Главная часть программы:

-3

И что у программы под капотом. Описание и поведение класса Philosopher():

-4

И класса Forks() с импортами:

-5

Ну и получился вот такой бесконечный цикл пожирания спагетти и размышлений...

-6

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

  1. Потренируйтесь с новым модулем requests. Скачайте 20 персонажей из базы данных о «Звёздных войнах» и сохраните их имена, возраст, пол в БД. Замерьте время работы программы.
  2. Добавьте потоки. Замерьте время работы и сравните результаты.
  3. Оформите решение в виде двух функций, чтобы можно было протестировать производительность обоих вариантов.

Заморочка с этой задачей возникла только в одном месте - 17й персонаж выдает None, вместо ответа, а персонажей нужно 20!!!

-7

Поэтому пришлось чуток предусмотреть сие дело, но тоже не идеально сделал, но работает. Все персонажи записаны БДшечку:

-8

И вот как это выглядит в коде:

-9
-10

Собственно, за основу, взята задача о загрузке фотографий котиков...

Задача 3. Печатный станок

Вернёмся к задаче с продавцами билетов.

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

Добавьте в задачу ещё одного персонажа — главного директора с печатным станком. По условию, как только количество проданных билетов приближается к такому, что каждый из продавцов сможет продать не более одного, то в этот момент директор должен добавить в общее число доступных билетов ещё сколько-то.

Пример: осталось четыре билета, директор добавляет шесть, всего билетов десять. Пусть директор может так делать, пока общее количество билетов не превысит общее число посадочных мест.

Пока директор пополняет билеты, продавцы не могут их продавать.

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

-11
-12
-13

Задача 4. Приоритетная очередь

Создайте два класса, наследуемые от класса  Thread: Producer и Consumer. Первый будет генерировать задачи и класть их в очередь, второй — брать задачу с наивысшим приоритетом и исполнять её. Для упрощения работы сделайте так, чтобы Producer сначала добавил все задачи в очередь, а только затем Consumer исполнил их.

В чате курса у кого-то было решение этой задачи, но там как-то через дебри пошел товарищ, решая задачу. Я же решил сделать в точности так как предписывает задание и вот что из этого получилось:

-14
-15
-16
-17

Получилось несколько иначе, нежели было написано в задании. Вот такой получился вывод:

-18

Меня смутило то что наивысшим приоритетом программа посчитала 0 а не 100. Я подумал что так и надо. Отправлю всё на проверку а там посмотрим.

Пришло сообщение от куратора о проделанной работе:

-19

Ну что ж, впереди Мультипоточность часть 2. А вы знаете что делать (лайк, подписка, комментарий ибо рекомендательные алгоритмы Дзена их любят).