Как в 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, обычно это самая медленная часть (обучение модели).
 
Maxim Dmitrievsky #:
numpy
numpy использую. Смотрю в диспетчере все ядра работают при испольнениии программы. По памяти не пойму. Ядра синхронно. Возможно вместе работают?
[Удален]  
Roman Poshtar #:
numpy использую. Смотрю в диспетчере все ядра работают при испольнениии программы. По памяти не пойму. Ядра синхронно. Возможно вместе работают?

Ну там же разные библиотеки могут многопоток/ядра использовать, а могут нет.

Надо конкретно по частям смотреть.

 
Что лучше будет работать? 12 ядер 24 потока на частотах 2,4 2,6 или 8 ядер на 16 потоках на частотах 3,1 3,4. Напишите кто побовал и знает. Заранее спасибо.
 
Roman Poshtar #:
Что лучше будет работать? 12 ядер 24 потока на частотах 2,4 2,6 или 8 ядер на 16 потоках на частотах 3,1 3,4. Напишите кто побовал и знает. Заранее спасибо.

Зависит от ядер процессора...

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

В целом - для каждой задачи всё индивидуально будет.

[Удален]  
Лучше всего работает оптимизированная логика и код.
 
Всем спасибо. Решил сравнить одновременным запуском на разных ПК. Отпишу по результату.
 
Выяснилось, что 2 ядра на 2,6 работают быстрее чем 4 ядра на 2.16. Все целероны. Прирост примерно 30\40%