@Nodar
Python, Ruby, JavaScript

Можно ли разделить нагрузку между потоками/процессами/ядрами?

Привет.
Появился вопрос такого характера:
Допустим, есть какой-то процесс, который требует много ресурсов на реализацию.
Можно ли его работу распределить между/потоками/процессами/ядрами? То есть ускорить выполнение программы. К примеру, архивируем большой файл, можно ли ускорить процесс архивации, распределив нагрузку?

Погуглив по этому поводу, я наткнулся на Parallel processing. Это оно?
  • Вопрос задан
  • 5827 просмотров
Пригласить эксперта
Ответы на вопрос 6
@radioxoma
Python в чистом виде никогда не будет самым быстрым. Хотите быстро - используйте компилируемые языки. Хотите ещё быстрее? Используйте GPU. И, тем не менее, python весьма удобен для создания высокоуровневого интерфейса и контроля за модулями на других языках.

Что касается требовательных к CPU задач (подчёркиваю, не input/output), то это довольно болезненная тема. Из-за GIL треды не будут исполняться на разных ядрах одновременно, однако это можно обойти. Итак, варианты:
  • использовать процессы (модуль multiprocessing, но порождение процесса, в сравнении с тредом, дорогое и поможет только если некая минимальная задача выполнятся достаточно долго);
  • cython (можно отпускать GIL и писать threading-safe код на си);
  • opencl (опять си, вычисления переносятся на совместимый CPU/GPU);
  • Theano (символьная математика, генерирует оптимизированный код, который будет исполняться на CPU или GPU).

Вот великолепная статья по указанным методам. Разумеется, все перечисленное имеет смысл, если задача допускает распараллеливание.
Ответ написан
Комментировать
@Calc
Также посмотрите в сторону алгоритмов "разделяй и властвуй"
Если задачу можно разделить на несколько независимых подзадач, то их(подзадачи) можно запускать в отдельных потоках.

Также почитайте в сторону forkjoin алгоритмов
Ответ написан
Комментировать
yttrium
@yttrium
если использовать стороннюю библиотеку.. то скорее всего там уже всё распараллелено.
если своё, то изучай для начала threading
Ответ написан
Комментировать
merryjane
@merryjane
Системный администратор
Можно сделать средствами cgroup, чтобы у приложения не отнимали ресурсы или их распределение было в определенном соотношении, что позволит приложению работать быстрее.
Ответ написан
Комментировать
питон не умеет паралеллится по ядрам.
надо запускать кол-во процессов равное кол-ву ядер и гонять между ними данные для обработки.
Ответ написан
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Под винду выкручиваюсь так
processhacker.sourceforge.net

НА серваке есть служба которая занимается обработкой. Сервак два ядра.
Если не задавать приоритет службе, обработка медленная, вебсервер тупит, ибо приоритеты у всех одинаковые.
Сделал affinity (affinity core) процессу с обработкой только первое ядро + реалтайм приоритет, на вебсервер назначил только второе ядро. Вроде как нормально)

По хорошему, нужно выносить нагрузку на другой вебсервер и его CPU.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы