Понимание использования ядер процессора многопроцессорного модуля - PullRequest
4 голосов
/ 26 февраля 2012

У меня есть простая main() функция, которая обрабатывает огромное количество данных.Поскольку у меня 8-ядерный компьютер с большим количеством оперативной памяти, мне было предложено использовать модуль multiprocessing python для ускорения обработки.Каждый подпроцесс займет около 18 часов.

Короче говоря, я сомневаюсь, что правильно понял поведение модуля multiprocessing.

Я как-то запускаю разные подпроцессы, как это:

def main():
    data = huge_amount_of_data().
    pool = multiprocessing.Pool(processes=cpu_cores) # cpu_cores is set to 8, since my cpu has 8 cores.
    pool.map(start_process, data_chunk) # data_chunk is a subset data.

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

Основной вопрос: могу ли я порождать8 подпроцессов и быть уверенным, что они будут работать правильно параллельно друг другу?

Кстати, подпроцессы никак не взаимодействуют друг с другом, и когда они завершаются, каждый из них генерирует файл базы данных sqlite.где они хранят результаты.Поэтому даже result_storage обрабатывается отдельно.

Чего я хочу избежать, так это того, что я запускаю процесс, который будет мешать другим работать на полной скорости.Мне нужно, чтобы код заканчивался примерно в 16 часов, а не в два раза, потому что у меня больше процессов, чем ядер.: -)

Ответы [ 2 ]

4 голосов
/ 26 февраля 2012

В качестве отступления, если вы создадите пул без аргументов, if автоматически выведет количество доступных ядер, используя результат cpu_count().

В любой современной многозадачной ОС ни одна программа, как правило, не сможет занять ядро ​​и не позволить другим программам работать на нем.

Сколько рабочих вы должны начать, зависит от характеристик вашей функции start_process. Количество ядер - не единственное соображение.

Если каждый рабочий процесс использует, например, 1/4 доступной памяти, запуск более 3 приведет к большому обмену и общему замедлению. Это состояние называется «память ограничена».

Если рабочие процессы выполняют не просто вычисления (например, чтение с диска или запись на диск), а другие, то им придется много ждать (поскольку диск намного медленнее ОЗУ; это называется «IO-привязка»). В этом случае может быть целесообразно запустить более одного рабочего на ядро.

Если рабочие не привязаны к памяти или IO, они будут ограничены количеством ядер.

1 голос
/ 26 февраля 2012

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

Основной поток сохранит свой собственный процесс, но поскольку функция map () заблокирована, процесс, вероятно, также будет заблокирован, без использования ядра ЦП.

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