2015-03-17 4 views
6

Примечание: Я «засыпал» в землю multiprocessing 2 дня назад. Поэтому мое понимание очень простое.Многопроцессорность: больше процессов, чем cpu.count

Я пишу и приложение для загрузки в amazon s3 ведра. В случае, если размер файла больше (100mb), Ive реализовал параллельные загрузки с использованием pool с модуля multiprocessing. Я использую машину с core i7, у меня был cpu_count от 8. У меня создалось впечатление, что если я делаю pool = Pool(process = 6), я использую 6 ядра, и файл начинает загружаться по частям, и загрузка для первых 6 частей начинается одновременно. Чтобы узнать, что произойдет, когда process больше, чем cpu_count, я ввел 20 (подразумевая, что я хочу использовать 20 ядер). К моему удивлению, вместо того, чтобы получить блок ошибок, программа начала загружать 20 частей одновременно (я использовал меньший chunk size, чтобы убедиться, что есть много частей). Я не понимаю этого поведения. У меня есть только 8 ядер, так как он не может принять программу ввода 20? Когда я говорю process=6, действительно ли он использует 6 потоков? Который может быть единственным объяснением того, что 20 является допустимым вводом, так как может быть 1000 нитей. Может кто-нибудь, пожалуйста, объясните это мне.

Edit:

I 'заимствованы' код из here. Я немного изменил его, когда я попросил пользователя использовать его для основного использования вместо того, чтобы устанавливать parallel_processes на 4

+1

Вы смешиваете нити, процессы и ядра. Все это очень разные вещи. если вы установите 'процессы = 6', он будет использовать только 6 ** процессов **, которые могут запускаться каждый на одном ядре, или они могут запускать все на одном ядре - это зависит от ОС и загрузки системы. Что касается «вопроса» - укажите код. –

ответ

7

Количество процессов, выполняющихся одновременно на вашем компьютере, не ограничено количеством ядер. На самом деле у вас, вероятно, есть сотни программ, работающих прямо сейчас на вашем компьютере - каждый со своим собственным процессом. Чтобы заставить его работать, ОС назначает один из ваших 8 процессоров для каждого процесса или потока только временно - в какой-то момент он может быть остановлен, а другой процесс займет свое место. См. What is the difference between concurrent programming and parallel programming?, если вы хотите узнать больше.

Редактировать: Назначение большего количества процессов в вашем примере загрузки может быть или не иметь смысла. Чтение с диска и отправка по сети обычно являются блокировкой в ​​python. Процесс, ожидающий считывания или отправки его части данных, может быть остановлен, так что другой процесс может начать его ввод-вывод. С другой стороны, при слишком большом количестве процессов либо ввод ввода-вывода, либо сетевой ввод-вывод станут узким местом, и ваша программа будет замедляться из-за дополнительных накладных расходов, необходимых для переключения процессов.

+0

при загрузке файла с более чем '1 Gb', время, затраченное на« ~ 10 минут »(при использовании последовательных загрузок), составляет« 6 минут »(когда я использую параллельные загрузки) – letsc

Смежные вопросы