Если вы просто хотите запустить функцию в отдельном потоке, минимальный рабочий шаблон:
Код: Выделить всё
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)
Если ваша цель — не просто «как создать поток», а:
- Максимизировать загрузку ЦП
- Автоматическое масштабирование по ядрам
- Уменьшить количество шаблонов
- Потенциально использовать дополнительное оборудование
Код: Выделить всё
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
Мобильная версия