Как использовать многопоточность в Python (и как выйти за ее рамки)Python

Программы на Python
Ответить
Anonymous
 Как использовать многопоточность в Python (и как выйти за ее рамки)

Сообщение Anonymous »

Прямой ответ на исходный вопрос
Если вы просто хотите запустить функцию в отдельном потоке, минимальный рабочий шаблон:

Код: Выделить всё

import threading

def worker():
print("Running in a separate thread")

t = threading.Thread(target=worker)
t.start()
t.join()
Если вам нужно передать аргументы:

Код: Выделить всё

import threading

def worker(x, y):
print(x + y)

t = threading.Thread(target=worker, args=(5, 3))
t.start()
t.join()
Это правильный и стандартный способ использования потоков.
Имейте в виду:
  • Код: Выделить всё

    threading
    лучше всего подходит для задач, связанных с вводом-выводом.
  • Из-за GIL он не обеспечивает настоящий параллелизм ЦП.
Для рабочих нагрузок, связанных с ЦП, вы обычно переходите к многопроцессорной обработке.:

Код: Выделить всё

from multiprocessing import Pool

def compute(x):
return x * x

with Pool() as p:
results = p.map(compute, range(10))

print(results)
Выход за рамки ручного управления потоками
Если ваша цель — не просто «как создать поток», а:
  • Максимизировать загрузку ЦП
  • Автоматическое масштабирование по ядрам
  • Уменьшить количество шаблонов
  • Потенциально использовать дополнительное оборудование
Вы можете использовать pyaccelerate:

Код: Выделить всё

pip install pyaccelerate
Вместо того, чтобы вручную управлять потоками или пулами, вы объявляете рабочие нагрузки и позволяете среде выполнения координировать выполнение.

Пример 1. Максимальная загрузка ЦП

Код: Выделить всё

from pyaccelerate import accelerate, ExecutionMode

@accelerate(mode=ExecutionMode.MAX_PERFORMANCE)
def heavy_compute(x):
total = 0
for i in range(10_000_000):
total += (x * i) % 7
return total

results = [heavy_compute(i) for i in range(8)]
print(results)
Это позволяет полностью использовать многоядерность без ручной настройки пулов процессов.

Пример 2 — пакетная обработка с высокой пропускной способностью

Код: Выделить всё

from pyaccelerate import map_accelerated, ExecutionMode

def heavy_compute(x):
total = 0
for i in range(5_000_000):
total += (x * i) % 5
return total

results = map_accelerated(
heavy_compute,
range(100),
mode=ExecutionMode.MAX_PERFORMANCE
)

print(results)
Задачи распределяются автоматически для оптимизации пропускной способности.

Пример 3 — аппаратно-зависимое выполнение

Код: Выделить всё

from pyaccelerate import accelerate, HardwareProfile

@accelerate(hardware=HardwareProfile.AUTO)
def matrix_op(x):
return x * x

results = [matrix_op(i) for i in range(1000)]
Выполнение адаптируется к доступному профилю оборудования, если оно поддерживается.

Сводка
  • Используйте многопоточность для простого параллелизма ввода-вывода
  • Используйте многопроцессорность для явного параллелизма ЦП
  • Используйте инструменты ускорения более высокого уровня для масштабируемого, ориентированного на производительность выполнения с меньше ручной оркестровки
Если вам нужны только потоки, используйте потоки.

Если вам нужна масштабируемость производительности, используйте соответствующий уровень абстракции.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -beyond-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»