Как в Python происходит работа с ядрами и потоками. Интересует процесс выполнения программы

 
Доброго. Может кто обяснить доступным языком для начинающих. 
 

Такие вещи задавать нужно не на форуме.

Вот что я нашел

В Python работа с ядрами и потоками реализуется через модули threading и multiprocessing . Важно понимать, что из-за Global Interpreter Lock (GIL) многопоточность в Python имеет ограничения, которые влияют на параллелизм. Вот подробное объяснение работы с ядрами и потоками в Python.


Многопоточность (threading)

Модуль threading позволяет создавать и управлять потоками. Поток — это отдельный путь выполнения внутри программы. Основное ограничение многопоточности в Python — это GIL, который позволяет выполнять только один поток Python-кода одновременно, даже на многоядерных процессорах.

Пример использования threading

import threading
import time

def print_numbers():
    for i in range(10):
        print(i)
        time.sleep(1)

def print_letters():
    for letter in 'abcdefghij':
        print(letter)
        time.sleep(1)

# Создание потоков
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# Запуск потоков
thread1.start()
thread2.start()

# Ожидание завершения потоков
thread1.join()
thread2.join()

print("Both threads have finished execution")

В этом примере два потока выполняются параллельно, но из-за GIL они не смогут использовать несколько ядер процессора для выполнения Python-кода одновременно.


Многопроцессность (multiprocessing)

Модуль multiprocessing позволяет создавать процессы, каждый из которых выполняется в своем интерпретаторе Python и, следовательно, не ограничен GIL. Это позволяет программе использовать несколько ядер процессора и выполнять код действительно параллельно.

Пример использования multiprocessing:

import multiprocessing
import time

def print_numbers():
    for i in range(10):
        print(i)
        time.sleep(1)

def print_letters():
    for letter in 'abcdefghij':
        print(letter)
        time.sleep(1)

# Создание процессов
process1 = multiprocessing.Process(target=print_numbers)
process2 = multiprocessing.Process(target=print_letters)

# Запуск процессов
process1.start()
process2.start()

# Ожидание завершения процессов
process1.join()
process2.join()

print("Both processes have finished execution")

В этом примере два процесса выполняются параллельно и могут использовать разные ядра процессора для выполнения кода.


Сравнение потоков и процессов

  1. Многопоточность ( threading ):

    • Легковесные.
    • Используют общую память, что облегчает обмен данными между потоками.
    • Ограничены GIL, что делает их менее эффективными для задач, требующих интенсивных вычислений.
  2. Многопроцессность ( multiprocessing ):

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

Когда использовать что

  • Многопоточность ( threading ) лучше подходит для задач ввода-вывода (I/O bound tasks), таких как сетевые операции, операции с файлами, и т.д., где время ожидания ввода-вывода можно эффективно использовать для выполнения других задач.
  • Многопроцессность ( multiprocessing ) лучше подходит для задач, требующих интенсивных вычислений (CPU bound tasks), таких как математические вычисления, обработка больших данных и т.д.

Используя multiprocessing , можно добиться настоящего параллелизма и использовать все доступные ядра процессора, что значительно увеличивает производительность для вычислительно-интенсивных задач.

 
Rashid Umarov #:

Такие вещи задавать нужно не на форуме.

Вот что я нашел

Огромное спасибо!

 

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

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

З.Ы. у катбуста есть распараллеливание + GPU, обычно это самая медленная часть (обучение модели).