Задать вопрос
L1Qu0R
@L1Qu0R
Веб разработчик

Что лучше выбрать, мультипоточность или мультипроцессинг?

Появилась задача переписать одну вещь в проекте, собственно решили делать на питоне.
Суть задачи:
>1000 активных процессов (ну либо потоков, надо выбрать), которые будут долбиться на другие сервера, забирать данные, парсить и тд и тп, но операции в принципе быстрые, правда эти процессы должны висеть круглосуточно и не падать, разве что ребутиться или завершаться по требованию.

Собсна уже почитал тучу холиваров на эту тему, а так как у самого основной язык не python, то прошу помощи у сообщества, помогите определиться что лучше: больше тысячи процессов запущенных одновременно, но с удобством их менеджмента, либо один процесс с тысячью потоками?
  • Вопрос задан
  • 6697 просмотров
Подписаться 5 Оценить 5 комментариев
Решения вопроса 1
@alex-t
Прогр. в команде rco.ru
Маленький "фокус" питона, если захотите писать без фреймворка (scrapy и пр.), что один и тот же код создается и для многопоточной, и для многопроцессной задачи, отличаясь только используемым пакетом и классом (threading / multiprocrssing). Так что на этапе разработки можно пробовать оба варианта, и уже по ходу решить, что лучше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@VekaVeka
Если вы не знакомы с Python, то для начала прочитайте про GIL - global interpreter lock.

Несколько лет назад выбор Python был бы оправдан. Но на сегодня я бы для решения такой задачи выбрал бы уже Go, а не Python.

Программировать на Go также просто как и на Python, а с параллельностью и конкурентностью у Go гораздо проще чем у Python.

Имхо, если язык не заточен на конкурентность - не Erlang, не Go и т.п. - то лучше запускать несколько экземпляров вашего приложения. По одному экземпляру на 1 физическое ядро.

Хотя 1000 потоков - не бог весь какая нагрузка.
Специально заморачиваться нужно только если вы хотите минимизировать оплату за хостинг или у вас эти задачи какие-то нагруженные.

У меня проект на Go прекрасно держит и 15 000 одновременных постоянных соединений, к примеру.
На слабом современном сервере (4 ядра, 4 гигабайта оперативки).
Ответ написан
gbg
@gbg
Любые ответы на любые вопросы
О разнице между процессами и потоками - у процессов за изоляцию отвечает операционная система. Чтобы два процесса могли повзаимодействовать, нужно обращение к ОС, которое ведет к переключению контекста, что накладно.

У потоков таких расходов нет. Итого - потоки легче процессов. Но у них хуже с изоляцией - падение одного потока может уронить весь процесс.

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

Если должны - выбор - потоки. И хорошая команда разработки. Не фигакпродакшн.
Ответ написан
Комментировать
sim3x
@sim3x
scrappy теперь поддерживает питон3
doc.scrapy.org/en/latest/news.html#news-betapy3

свой велосипед писать не нужно
Ответ написан
Комментировать
VGrabko
@VGrabko
Golang, Php, Js
Ну я бы не запускал 1к. процессов. Я бы сделал процессов по количеству ядер процессора. К примеру унас 8 ядер на сервере то имеем 8 процессов и по 125 потоков в каждом.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы