Подтвердить что ты не робот

Ограничение процесса пула многопроцессорности Python

При использовании объекта Pool из модуля многопроцессорности число процессов ограничено количеством ядер ЦП? Например. если у меня есть 4 ядра, даже если я создам пул с 8 процессами, только 4 будет запущено за один раз?

4b9b3361

Ответ 1

Вы можете запросить столько процессов, сколько захотите. Любой предел, который может существовать, будет навязываться вашей операционной системой, а не multiprocessing. Например,

 p = multiprocessing.Pool(1000000)

вероятно, пострадает от уродливой смерти на любой машине. Я пытаюсь использовать его на своем ящике, когда я печатаю его, и ОС измельчает мой диск, пытаясь сменить ОЗУ безумно - наконец, убил его после того, как он создал около 3000 процессов; -)

В отношении того, сколько будет выполняться "за один раз", Python в этом не говорит. Это зависит от:

  • Сколько вашего оборудования может работать одновременно; и,
  • Как ваша операционная система решает предоставить аппаратные ресурсы всем процессам на вашем компьютере, которые в настоящее время работают.

Для задач с привязкой к ЦП нет смысла создавать больше процессов Pool, чем у вас есть ядра для их запуска. Если вы пытаетесь использовать свою машину для других вещей, тогда вы должны создать меньше процессов, чем ядра.

Для задач с привязкой к I/O может возникнуть смысл создать еще несколько процессов Pool, чем ядра, поскольку процессы, вероятно, потратят большую часть времени на блокировку (ожидая завершения ввода-вывода).

Ответ 2

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

поэтому наилучшей практикой программирования является использование семафора, ограниченного числом процессоров вашей системы. вероятно,

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

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

pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) 
#this will detect the number of cores in your system and creates a semaphore with that  value.  

P.S. Но полезно использовать количество ядер-1 всегда.

Надеюсь, что это поможет:)

Ответ 3

Это правильно. Если у вас 4 ядра, то сразу можно запустить 4 процесса. Помните, что у вас есть системные элементы, которые нужно продолжать, и было бы неплохо определить номер процесса number_of_cores - 1. Это предпочтение, а не обязательное. Для каждого процесса, который вы создаете, есть накладные расходы, поэтому на самом деле вы используете больше памяти для этого. Но если ОЗУ не проблема, тогда идите. Если вы используете Cuda или другую библиотеку на основе GPU, у вас есть другая парадигма, но для другого вопроса.

Ответ 4

Пока нет ограничений, которые вы можете установить, если вы хотите понять, какое удобное число использовать для процессов, связанных с процессором (которые, как я подозреваю, вы ищете здесь), вы можете запустить следующее:

>>> import multiprocessing
>>> multiprocessing.cpu_count()
1

В ответе здесь отмечены хорошие примечания об ограничениях (особенно в Linux):