Учебники

Параллелизм в Python — Введение

В этой главе мы поймем концепцию параллелизма в Python и узнаем о различных потоках и процессах.

Что такое параллелизм?

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

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

Исторический обзор параллелизма

Следующие пункты дадут нам краткий исторический обзор параллелизма —

Из концепции железных дорог

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

Параллельные вычисления в академических кругах

Интерес к параллелизму информатики начался с исследовательской работы, опубликованной Эдсгером В. Дейкстра в 1965 г. В этой статье он выявил и решил проблему взаимного исключения, свойства контроля параллелизма.

Параллельные примитивы высокого уровня

В последнее время программисты получают улучшенные параллельные решения из-за внедрения высокоуровневых примитивов параллелизма.

Улучшенный параллелизм с языками программирования

Языки программирования, такие как Google Golang, Rust и Python, сделали невероятные разработки в областях, которые помогают нам получать лучшие параллельные решения.

Что такое поток и многопоточность?

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

Поток состоит из следующих компонентов —

  • Счетчик программ, состоящий из адреса следующей исполняемой инструкции

  • стек

  • Набор регистров

  • Уникальный идентификатор

Счетчик программ, состоящий из адреса следующей исполняемой инструкции

стек

Набор регистров

Уникальный идентификатор

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

пример

Предположим, мы запускаем определенный процесс, в котором мы открываем MS Word, чтобы вводить в него содержимое. Один поток будет назначен для открытия MS Word, а другой поток потребуется для ввода содержимого в нем. И теперь, если мы хотим отредактировать существующий, тогда потребуется другой поток, чтобы выполнить задачу редактирования и так далее.

Что такое процесс и многопроцессорность?

Процесс определяется как объект, который представляет собой базовую единицу работы, которая должна быть реализована в системе. Проще говоря, мы пишем наши компьютерные программы в текстовом файле, и когда мы выполняем эту программу, она становится процессом, который выполняет все задачи, упомянутые в программе. В течение жизненного цикла процесса он проходит через различные этапы — Пуск, Готов, Запуск, Ожидание и Завершение.

Следующая диаграмма показывает различные этапы процесса —

многопроцессорная обработка

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

Многопроцессорная One

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

Мультипроцессор Два

Python — один из самых популярных языков программирования. Ниже приведены некоторые причины, которые делают его пригодным для одновременных приложений —

Синтаксический сахар

Синтаксический сахар — это синтаксис в языке программирования, предназначенный для облегчения чтения или выражения. Это делает язык «более сладким» для использования человеком: вещи могут быть выражены более четко, более кратко или в альтернативном стиле, основанном на предпочтениях. Python поставляется с методами Magic, которые могут быть определены для воздействия на объекты. Эти магические методы используются в качестве синтаксического сахара и связаны с более простыми для понимания ключевыми словами.

Большое Сообщество

Язык Python стал свидетелем массового принятия среди исследователей данных и математиков, работающих в области ИИ, машинного обучения, глубокого обучения и количественного анализа.

Полезные API для параллельного программирования

Python 2 и 3 имеют большое количество API, предназначенных для параллельного / параллельного программирования. Наиболее популярными из них являются многопоточность, многопоточность, asyncio, gevent и greenlets и т. Д.

Ограничения Python при реализации параллельных приложений

Python имеет ограничение для одновременных приложений. Это ограничение называется GIL (Global Interpreter Lock) и присутствует в Python. GIL никогда не позволяет нам использовать несколько ядер CPU, и поэтому мы можем сказать, что в Python нет настоящих потоков. Мы можем понять концепцию GIL следующим образом —

GIL (глобальная блокировка интерпретатора)

Это одна из самых противоречивых тем в мире Python. В CPython GIL является мьютексом — блокировкой взаимного исключения, которая обеспечивает безопасность потоков. Другими словами, мы можем сказать, что GIL препятствует параллельному выполнению кода Python несколькими потоками. Блокировка может удерживаться только одним потоком за раз, и если мы хотим выполнить поток, он должен сначала получить блокировку. Диаграмма, показанная ниже, поможет вам понять работу GIL.

Ограничения

Однако в Python есть некоторые библиотеки и реализации, такие как Numpy, Jpython и IronPytbhon. Эти библиотеки работают без какого-либо взаимодействия с GIL.