Программа Python предназначена для одновременной работы только на одном процессоре или ЦП, где один поток контролирует программу. Язык программирования разработан таким образом, чтобы решать в основном проблемы управления памятью. Для программ, работающих на нескольких ЦП, возникают проблемы, связанные с общей памятью и состоянием гонки. Такими языками являются C, C++ и Go, которые используют все доступные процессоры. Просто запуская программу на одном ЦП, они избегают этих и других проблем, гарантируя простоту использования.

Однако этот дизайн быстро становится сложным для более сложных проектов. Вот тут-то и появляется глобальная блокировка интерпретатора python (GIL). Чтобы контролировать поток программы, они используют эту блокировку для ограничения доступа к процессорам. Для более опытных программистов это называется мьютексом. Этот GIL позволяет одному потоку, работающему на одном процессоре, одновременно управлять программой Python. Функциональность GIL более четко показана на изображении ниже. Теперь ясно, что одна программа на Python по умолчанию работает только на одном ядре.

К счастью, есть способы обойти эту конструкцию GIL. Библиотеки существуют для реализации многопоточности и многопроцессорности в python.

Резьба

Потоки в python можно реализовать с помощью threading lib. Однако многопоточность — это не то же самое, что использование нескольких процессов. Из-за GIL все потоки, созданные в python, будут выполняться на одном процессоре. Планировщики используются для оптимизации выполнения потоков на одном процессоре.

Однако есть исключения.

  1. Если операции основаны на вводе/выводе, они выполняются на всех процессорах. Например, драйверы селена используют протокол HTTP, который является операциями ввода/вывода. Таким образом, при запуске драйверов в потоках они распределяются по всем процессорам.
  2. Библиотеки, построенные на C и C++, будут работать на нескольких процессорах. Например, NumPy — это библиотека, построенная на C, поэтому при выполнении операций NumPy они используют все доступные процессоры.

Они не вызывают проблем с управлением памятью и поэтому распределяются для оптимизации производительности. Это показано на рисунке ниже.

Многопроцессорность

Если операции не входят в исключения, упомянутые выше, и вам все же необходимо выполнять операции параллельно, то библиотеки multiprocessing или concurrent.futures являются наиболее подходящими. способ пойти.

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

Ключевые побеги / Заключение

  • Многопроцессорные потоки lib сильно отличаются от многопоточных потоков lib. Многопроцессорные потоки библиотеки порождают совершенно новые интерпретаторы Python для выполнения операций на другом ядре. В то время как библиотека потоков порождает потоки внутри основного потока, работающего на одном ядре.
  • GIL выполняет операции ввода-вывода и библиотеки C на нескольких ядрах.
  • GIL можно полностью обойти с помощью многопроцессорной библиотеки.

Спасибо, что прочитали! Надеюсь, что это было прямо к делу и прояснило некоторые неправильные представления.

Рекомендации