Рубрики
Без рубрики

Многопоточность в Python: Простая ссылка

Многопоточность в Python – это способ достижения многозадачности в python с использованием концепции потоков.

Автор оригинала: Pankaj Kumar.

Многопоточность в Python – это способ достижения многозадачности в python с использованием концепции потоков.

Что такое нить?

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

Каковы преимущества многопоточности в Python?

Создание многопоточных приложений имеет немало преимуществ. Давайте рассмотрим некоторые из преимуществ здесь:

  • Эффективное использование ресурсов
  • Более отзывчивый
  • Совместное использование ресурсов делает его более экономичным
  • Эффективное использование многопроцессорной архитектуры за счет параллелизма
  • Экономит время
  • Потоки (поскольку они являются частью одного и того же процесса) взаимодействуют друг с другом легче, чем если бы они были отдельными процессами
  • Они не требуют больших затрат памяти
  • Многопоточные серверы и интерактивные графические интерфейсы используют исключительно многопоточность.

Как добиться многопоточности в Python?

Давайте перейдем к созданию нашего первого многопоточного приложения.

1. Импортируйте модуль нарезания резьбы

Для создания потока мы будем использовать модуль threading .

import threading

Модуль threading состоит из Класс Thread , экземпляр которого создается для создания потока.

Поток может быть создан путем создания объекта класса Thread. Аргументы для этого класса следующие:

  1. цель: Здесь указана функция, вызываемая потоком. Эта функция является вызываемым объектом, вызываемым методом run() потока.
  2. args: Здесь мы указываем аргументы функции target .
def print_hi(num): 
    print("Hi, you are customer ",num)

t1 = threading.Thread(target=print_square, args=(10,))

Приведенный выше фрагмент кода вызывает функцию print_hi () , вызываемую в качестве параметра target . Эта функция имеет один параметр, а именно num , который задается с помощью args .

Иллюстрация Основного Потока И Дочерних Потоков

2. Запуск потока

Поток запускается путем вызова метода start() модуля threading для объекта потока. Иллюстрация того же показана ниже:

t1.start()

Он должен вызываться не более одного раза для каждого объекта потока. Он организует вызов метода run() объекта в отдельном потоке управления.

Этот метод вызовет RuntimeError при вызове более одного раза для одного и того же объекта потока.

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

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

3. Метод соединения потока

def print_hi(num): 
    print("Hi, you are customer ",num)

t1 = threading.Thread(target = print_hi, args=(10,))
t1.start()
t1.join()
print("End")

В приведенном выше фрагменте кода класс Thread используется для создания объекта, и он был назван как t1. Метод start() вызывается для объекта потока t1, который отмечает начало действия потока.

Затем вызывается метод join () . Таким образом, мы гарантируем, что основная программа останавливает выполнение основного потока и ожидает завершения потока t1. Как только t1 завершит свою деятельность, основной поток (основная программа) может продолжить свое выполнение. Следовательно, строка print("End") выполняется только после завершения действия потока.

Hi, you are customer 10
End

Без использования метода join() интерпретатор имеет выбор между двумя операторами печати – print("Привет, вы клиент ", num) и print("Конец") . В таких сценариях невозможно предсказать, какой оператор print будет отображаться первым, поскольку выполнение этих строк выбирается интерпретатором.

4. Синхронизация потоков в Python

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

Необходимо убедиться, что два потока не обращаются к этому ресурсу одновременно, так как это может привести к состоянию гонки .

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

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

Недостатки многопоточности

  • Увеличивает сложность программы.
  • Необходима синхронизация общих ресурсов (объектов, данных).
  • Трудно отлаживать непредсказуемые результаты
  • Создание и синхронизация потоков требует больших затрат ресурсов процессора и памяти.

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

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