21  Параллельное выполнение инструкций. Многопроцессность vs многопоточность.

21.1 Рекомендуемая литература

21.2 Цели и задачи

Целью данной работы является изучение особенностей многопоточного и многопроцессного кода. Для достижения поставленной цели необходимо решить следующие задачи:

  1. Освоить написание многопоточного кода с синхронизацией
  2. Освоить написание многопроцессного кода с синхронизацией.
  3. Сравнить производительность многопоточного и многопроцессного кода

21.3 Ход работы

21.3.1 Описание задания

  1. Создайте программу, которая считывает последовательности из FASTA-файла.
  2. Реализуйте поиск и подсчет аминокислот по разным физико-химическим классам: гидрофобные, гиброфильные нейтральные, гидрофильные положительные, гидрофильные отрицательные. В случае, если встречаются символы, отличные от стандартного алфавита аминокислот, либо фильтруете запись, либо считаете такие отдельной графой (на ваш выбор). Подробнее на Figure 21.1
  3. Используйте сначала многопоточность, затем многопроцессность для параллельного анализа последовательностей.
  4. Обеспечьте синхронизацию потоков/процессов при подсчете общего количества найденных кодонов.
Figure 21.1: Типы аминокислот

21.3.2 Подготовка к выполнению

Warning

Тщательно документируете свои действия и результат!

  1. Нам необходим тестовый пример. Скачайте тестовый пример последовательностей любого понравившегося белка с базы данных Uniprot. Смотрите, чтобы количество последовательностей было больше 100000.
Figure 21.2: Uniprot

На Figure 21.2 показано, на примере белка инсулина, как можно скачать все последовательности: ничего не выбирая нажать кнопку download. Затем выбрать формат fasta. Для увеличения скорости скачаивания рекомендую выбрать сжатый формат, но для работы тогда нам необходимо её разархивировать.

Note

Доп. задание (необязательно): реализуйте этот этап целиком на Python, с использованием REST API Uniprot и из генератора URL запросов

  1. Возьмите несколько небольших частей этого файла и сохраните в отдельные файлы. Это будут простые тестовые примеры. Подготовьте разного размера - 100,1000, 10000.

  2. Для работы с fasta файлами рекомендую установить библиотеку biopython. Хороший учебник с примерами

conda install -c bioconda biopython

21.3.3 Шаги для решения задачи

  1. Необходимо прописать логику программы в однопоточном режиме. Рекомендую реализовывать её в объектно-ориентированной парадигме. Таким образом вам потребуется класс ProteinAnalyzer, который умеет читать fasta файлы, подсчитывать нужную статистику и сохранять её. Чтение fasta файла с помощью библиотеки biopython можно производить следующим образом.
from Bio import SeqIO

for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
    print(seq_record.id)
    print(repr(seq_record.seq))
    print(len(seq_record))

Запись из fasta файла становится объектом класса SeqRecord, который содержит объект класса Seq (seq_record.seq). С таким объектом можно работать как с обычной строкой. Примеры

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

  1. После проверки в однопоточном режиме, приступайте к реализации многопоточного поведения. Вам потребуется синхронизирующая очередь. Крайне полезны могут оказаться примеры из книги(с.83). Проверьте сначала ваш код на маленьких примерах. Используйте модуль time для измерения работы программы.

  2. Используя примеры из книги(с.113-114), реализуйте многопроцессную реализацию. Проверьте сначала ваш код на маленьких примерах. Используйте модуль time для измерения работы программы.

  3. Постройте график зависимости времени выполнения программы от количества входных последовательностей в разном режиме работы программы при фиксированном, не очень большом количестве потоков/процессов. Сделайте выводы.

  4. Постройте график зависимости времени выполнения от числа потоков, процессов при большом входном файле фиксированного размера. Сделайте выводы.

  5. Предложите оптимальный подход из предложенных с обоснование и способы улучшения вашей реализации.

21.4 Вопросы для защиты

  1. Что такое поток? Что такое процесс?
  2. Таксономия Флинна
  3. Модели организации памяти.
  4. Виды параллелизма
  5. Оценка работы параллельного кода
  6. Механизмы синхронизации между потоками и процессами.